1. 程式人生 > 其它 >C++ 合法的三角形個數

C++ 合法的三角形個數

題目:給一個長度為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; }