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

3Sum เล็กลงใน C++


สมมติว่าเรามีอาร์เรย์ของจำนวนเต็ม n ตัวที่เรียกว่า nums และเรามีเป้าหมายด้วย เราต้องหาจำนวนของดัชนี triplets (i, j, k) ที่นี่ i, j, k ทั้งหมดอยู่ในช่วง 0 ถึง n - 1 และนั่น เป็นไปตามเงื่อนไข nums[i] + nums[j] + nums[k]

ดังนั้น หากอินพุตมีค่าเท่ากับ nums =[-2,0,1,3] และเป้าหมาย =2 ผลลัพธ์จะเป็น 2 เนื่องจากมีแฝดสามตัวที่ผลรวมน้อยกว่า 2:[-2,0, 1] และ [-2,0,3].

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

  • ยกเลิก :=0

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

  • n :=ขนาดของ a

  • สำหรับการเริ่มต้น i :=0 เมื่อ i

    • ซ้าย :=i + 1, ขวา :=n - 1

    • ขณะที่ซ้าย <ขวา ทำ -

      • ผลรวม :=a[i] + a[left] + a[right]

      • ถ้าผลรวม

        • ret :=ret + ขวา - ซ้าย

        • (เพิ่มขึ้นเหลือ 1)

      • มิฉะนั้น

        • (ลดสิทธิ์ลง 1)

  • รีเทิร์น

ตัวอย่าง

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   int threeSumSmaller(vector<int<& a, int t) {
      int ret = 0;
      sort(a.begin(), a.end());
      int n = a.size();
      for (int i = 0; i < n - 2; i++) {
         int left = i + 1;
         int right = n - 1;
         while (left < right) {
            int sum = a[i] + a[left] + a[right];
            if (sum < t) {
               ret += right - left;
               left++;
            }
            else
               right--;
         }
      }
      return ret;
   }
};
main(){
   Solution ob;
   vector<int< v = {-2,0,1,3};
   cout << (ob.threeSumSmaller(v,2));
}

อินพุต

[-2,0,1,3] 2

ผลลัพธ์

2