Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ช่วงที่เล็กที่สุด II ใน C ++


สมมติว่าเรามีอาร์เรย์ A ของจำนวนเต็ม สำหรับแต่ละจำนวนเต็ม A[i] เราต้องเลือก x =-K หรือ x =K และเพิ่ม x ให้กับ A[i] (เพียงครั้งเดียว) หลังจากกระบวนการนี้ เรามีอาร์เรย์ B เราต้องหาความแตกต่างที่น้อยที่สุดที่เป็นไปได้ระหว่างค่าสูงสุดของ B และค่าต่ำสุดของ B ดังนั้นหากอินพุตคือ A =[0,10], K =2 แล้ว ผลลัพธ์จะเป็น 6 เนื่องจาก B =[2,8].

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • set ret :=0, n :=ขนาดของอาร์เรย์ A

  • จัดเรียงอาร์เรย์ A

  • set ret :=องค์ประกอบสุดท้ายของ A – องค์ประกอบแรกของ A

  • ขวา :=องค์ประกอบสุดท้ายของ A – K และซ้าย :=องค์ประกอบแรกของ A + k

  • สำหรับฉันอยู่ในช่วง 0 ถึง n – 1

    • mx :=สูงสุดของ A[i] + k และขวา

    • mn :=นาทีของ A[i + 1] – k และซ้าย

    • ret :=นาทีของ ret และ (mx - min)

  • รีเทิร์น

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

ตัวอย่าง

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int smallestRangeII(vector<int>& A, int k) {
      int ret = 0;
      int n = A.size();
      sort(A.begin(), A.end());
      ret = A[n - 1] - A[0];
      int mx, mn;
      int right = A[n - 1] - k;
      int left = A[0] + k;
      for(int i = 0; i < n - 1; i++){
         mx = max(A[i] + k, right);
         mn = min(A[i + 1] - k, left);
         ret = min(ret, mx - mn);
      }
    return ret;
   }
};
main(){
   vector<int> v = {0, 10};
   Solution ob;
   cout << (ob.smallestRangeII(v, 2));
}

อินพุต

[0,10]
2

ผลลัพธ์

6