สมมุติว่าเรามีอาร์เรย์ของตัวเลข เราต้องหาจำนวน triplets ที่เลือกจากอาร์เรย์ที่สามารถสร้างสามเหลี่ยมได้ ถ้าเราหามันเป็นความยาวด้านของสามเหลี่ยม ดังนั้นหากอินพุตเป็น [2,2,3,4] ผลลัพธ์จะเป็น 3 เนื่องจากมีแฝดสาม [2,3,4] ใช้ 2 ตัวแรก [2,3,4] ใช้ 2 อันที่สอง และ [2,2,3].
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
ret :=0, n :=ขนาดของ nums, sort nums
-
สำหรับฉันอยู่ในช่วง n − 1 ลงไปที่ 0
-
ขวา :=i − 1, ซ้าย :=0
-
ขณะที่ซ้าย <ขวา
-
ผลรวม :=nums[ซ้าย] + nums[ขวา]
-
ถ้า sum> nums[i] ให้เพิ่ม ret โดย right − left, ลด right 1 มิฉะนั้น ให้เพิ่มไปทางซ้าย 1
-
-
-
รีเทิร์น
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; class Solution { public: int triangleNumber(vector<int>& nums) { int ret = 0; int n = nums.size(); sort(nums.begin(), nums.end()); for(int i = n − 1; i >= 0; i−−){ int right = i − 1; int left = 0; while(left < right){ int sum = nums[left] + nums[right]; if(sum > nums[i]){ ret += right − left; right−−; }else left++; } } return ret; } }; main(){ vector<int> v = {2,2,3,4}; Solution ob; cout << (ob.triangleNumber(v)); }
อินพุต
[2,2,3,4]
ผลลัพธ์
3