zoukankan      html  css  js  c++  java
  • leetcode18 四数之和 双指针

    题外话:

    这道题让我想起了

    挑战程序设计竞赛有一个抽签问题,类似的a+b+c+d=target,可以重复使用一个数。

    a+b+c+d=target转化为 a+b=target-c-d。  如果只是判断是否存在,那么可以预处理,得到所有c+d的值,然后binary_search (target-a-b)

    处理方法

    对于一个共有n个数的数组,准备一个数组int kk

    kk[c*n+d]=k[c]+k[d]。

    复杂度O(n^2log(n))

     然后这道题:

    就和前两个题差不多,先固定两个数,然后双指针法

    class Solution {
    public:
        vector<vector<int>> fourSum(vector<int>& nums, int target) {
            vector<vector<int>>ret;
            if(nums.empty())
                return ret;
            int len=nums.size();
            if(len<4)
                return ret;
            sort(nums.begin(),nums.end());
            for (int i = 0; i < len - 3; i++) {
                if (i > 0 && nums[i] == nums[i - 1]) 
                    continue;
                for(int j=i+1;j<len-2;j++){
                    if(nums[j]==nums[j-1]&&(j>i+1))
                        continue;
                int l = j + 1;
                int r = len - 1;
                while (l < r) { //多组
                    int s = nums[i] + nums[l] + nums[r]+nums[j];
                    if (s > target)
                        r--;
                    else if (s < target)
                        l++;
                    else {
                        ret.push_back({nums[i], nums[j],nums[l], nums[r]});
                        while (l < r && nums[l] == nums[++l]);
                        while (l < r && nums[r] == nums[--r]);
                        }
                    }
                }
            }
            return ret;
        }
    };
  • 相关阅读:
    【JavaScript DOM 编程艺术】 笔记
    如何循序渐进有效学习 JavaScript?
    如何正确学习JavaScript
    HTML5学习
    window上杀死node进程
    HTML5:离线存储
    js面向对象的理解
    H5项目常见问题及注意事项
    查找已连接过的wifi密码
    flex的兼容
  • 原文地址:https://www.cnblogs.com/lqerio/p/11759402.html
Copyright © 2011-2022 走看看