leetcode 15. 3Sum

这道题最后各种调整优化,但是就是超时,我也是跪了,所以我觉得根本还是算法的问题,我现在的复杂度是O(n^2logn)所以,感觉复杂度略高。
细细想一下,似乎假设确定了a,那么b和c的和是一定的,又因为是排好序的,所以感觉O(n^2)就可以搞定。

方法1:我的方法

vector<vector<int>> threeSum(vector<int>& nums){
vector<vector<int>> ret;
if(nums.size()<3)return ret;
sort(nums.begin(),nums.end());

//vector<int>::iterator iter = unique(nums.begin(),nums.end());
//nums.erase(iter,nums.end());
/*for(int i=0;i<nums.size();i++){
    cout<<nums[i]<<' ';
}*/
for(int i=0;i<nums.size()-1;++i){
    if(i!=0 && nums[i] == nums[i-1])continue;
    for(int j=i+1;j<nums.size();++j){
        int a = nums[i],b = nums[j];
        int c = -a-b;
        if( (c<a) || (c>b) )continue;
        int left = i,right = j;
        while(left<=right){
            int mid = (left+right)/2;
            if(nums[mid]>c){
                right = mid-1;
            }else{
                left = mid+1;
            }
        }
        while( (right==i || right==j) && right>=0 )right--;

        if( right>=0 && nums[right]==c ){
            vector<int> elem;
            /*elem.push_back(min(a,min(b,c)));
            elem.push_back(0-min(a,min(b,c))-max(a,max(b,c)));
            elem.push_back(max(a,max(b,c)));*/
            elem.push_back(a);
            elem.push_back(c);
            elem.push_back(b);
            ret.push_back(elem);
        }
    }
}
vector<vector<int> >::iterator iter = unique(ret.begin(),ret.end());
ret.erase(iter,ret.end());
return ret;
}

方法2:discuss中找的其他人的方法,就是O(n^2)

public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
if(nums == null || nums.length < 3) return result;
Arrays.sort(nums);

int len = nums.length;
for(int i = 0; i < len; i++) {
    if(i > 0 && nums[i] == nums[i - 1]) continue;        // Skip same results
    int target = 0 - nums[i];
    int j = i + 1, k = len - 1;
    while(j < k) {
        if(nums[j] + nums[k] == target) {
            result.add(Arrays.asList(nums[i], nums[j], nums[k]));
            while(j < k && nums[j] == nums[j + 1]) j++;  // Skip same results
            while(j < k && nums[k] == nums[k - 1]) k--;  // Skip same results
            j++; k--;
        } else if(nums[j] + nums[k] < target) {
            j++;
        } else {
            k--;
        }
    }
}
return result;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值