leetcode611 Valid Triangle Number

一步步优化,开始,是相当于三重循环。效率很差

class Solution {
public:

    int triangleNumber(vector<int>& nums) {
        int len=nums.size();
        if(len<3) return 0;
        int count=0;
        sort(nums.begin(),nums.end(),greater<int>());
        for(int i=0;i<=len-1;i++)
        {
            int sum=nums[i];
            for(int j=i+1,k=j+1;j<=len-2;)
            {
                if(k<=len-1&&nums[j]+nums[k]>sum)
                {
                    count++;
                   // printf("%d %d %d\n",nums[i],nums[j],nums[k]);
                    k++;
                }
                else
                {
                    j++;
                    k=j+1;
                    continue;
                }        
            }
        }
        return count;
    }
};

后边使用了降序排序,然后i固定,j=i+1,k=len-1,效率还是很差。

class Solution {
public:

    int triangleNumber(vector<int>& nums) {
        int len=nums.size();
        if(len<3) return 0;
        int count=0;
        sort(nums.begin(),nums.end(),greater<int>());
        for(int i=0;i<=len-1;i++)
        {
            int sum=nums[i];
            for(int j=i+1,k=len-1;j<=len-2&&j<k;)
            {
                if(j<k&&nums[j]+nums[k]>sum)
                {
                    count+=k-j;
                    j++;
                    k=len-1; 
                }
                else if(nums[j]+nums[k]<=sum)
                    k--;
            }
        }
        return count;
    }
};

最后看到discussion中,解法直接用的升序的数组,思路一致,不知道是不是这个原因,少了降序排序,效率提高的很大。

class Solution {
public:

    int triangleNumber(vector<int>& nums) {
        int len=nums.size();
        if(len<3) return 0;
        int count=0;
        sort(nums.begin(),nums.end());
        for(int i=len-1;i>=2;i--)
        {
            int l=0;
            int r=i-1;
            while(l<r)
            {
                if(nums[l]+nums[r]>nums[i])
                {
                    count+=r-l;
                    r--;
                }
                else
                    l++;
            }
        }
        return count;
    }
};


猜你喜欢

转载自blog.csdn.net/momo_mo520/article/details/80068920
今日推荐