C++ 合法的三角形個數
阿新 • • 發佈:2022-01-16
題目:給一個長度為N的非負整數陣列nums,請你計算一下,有多少個三元組代表的邊長可以組成三角形
資料範圍 :1≤N≤1000,0≤nums[i]≤1000
該題的解法如下:
首先,對各邊長進行排序,方便獲取三邊中最長的邊。
然後,進入迴圈,迴圈體如下:
由小到大找最長邊(迴圈)
從最長邊開始由大到小找次長邊(迴圈)
從次長邊開始由大到小找最短邊。(迴圈計數法,或者用二分查詢法找上界,然後用計算中間個數)
int validTriangleNumber(vector<int>& nums) { int length = nums.size(); if (length < 3) return 0; sort(nums.begin(), nums.end());int res = 0; for (int right = 2; right < length; ++right) { for (int mid = right - 1; mid > 0; --mid) { int temp = nums[right] - nums[mid]; if (temp > nums[mid]) break; auto bg = nums.begin(); auto upperBound= upper_bound(bg, bg + mid, temp); res += mid - (upperBound - bg); } } return res; }
//二分查詢上界法 int validTriangleNumber(vector<int>& nums) { int length = nums.size(); if (length < 3) return 0; sort(nums.begin(), nums.end());//排序 int res = 0; for (int right = 2; right < length; ++right)//right最長邊序號 { for (int mid = right - 1; mid > 0; --mid)//mid次長邊序號 { int temp = nums[right] - nums[mid];//找出最短邊的最短長度temp if (temp > nums[mid]) break;//如果最短邊長度的最短長度已經比次長長,打斷迴圈 auto bg = nums.begin(); auto upperBound = upper_bound(bg, bg + mid, temp);//利用二分法找出最短邊長度上界 res += mid - (upperBound - bg);//計算中間邊的個數 } } return res; }