• 【LeetCode 18】四数之和


    题目链接

    【题解】

    两重循环枚举[i..j]这个区间 同时规定必取nums[i]和nums[j] 那么现在的问题就变成在下标为[i..j]这个区间的数字里面找两个数字使他们的和为target-nums[i]-nums[j]. 这个问题可以在O(N)的复杂度解决。 所以复杂度就是$O(N^3)$ 当然也可以用meet-in-middle写成O(N^2)的 在map里面存个和为x的两个数分别有什么(存他们俩的下标对)。 然后再次两重循环去找map中和target-nums[i]-nums[j]的pair有多少。 然后合并。 去掉有相同下标的情况(一个数字用了两次);

    【代码】

    class Solution {
    public:
        vector<vector<int>> fourSum(vector<int>& nums, int target) {
            vector<vector<int> > ans;
            ans.clear();
            vector<int> temp;
            temp.resize(4);
            sort(nums.begin(),nums.end());
            int len = nums.size();
            for (int i = 0;i < len;i++){
                if (i>0 && nums[i]==nums[i-1]) continue;
                for (int j = i+3;j<len;j++){
                    while(j+1<len && nums[j+1]==nums[j]) j++;
                        //在i..j这个范围内找和为target-nums[i]-nums[j]的数字
                    int key = target-nums[i]-nums[j];
                    int l = i+1,r = j-1;
                    while (l<r){
                        if (nums[l]+nums[r]>key){
                            r--;
                        }else if (nums[l]+nums[r]<key){
                            l++;
                        }else {
                            temp[0] = nums[i];temp[1] = nums[l];
                            temp[2] = nums[r];temp[3] = nums[j];
                            ans.push_back(temp);
                            while (l+1<r && nums[l+1]==nums[l]) l++;
                            while (r-1>l && nums[r-1]==nums[r]) r--;
                            l++;r--;
                        }
                    }
                }
            }
            return ans;
        }
    };
    
  • 相关阅读:
    4-----flask快速入门
    2-----python 常用数据结构回顾以及推导式
    2-1 test 代码梳理,各个目录说明
    13----- sentry实现错误日志的监控
    2----生鲜超市 (开发环境搭建)
    2、虚拟环境
    1、DRF+VUE 项目架构
    jenkins介绍,Jenkins安装,Jenkins发布PHP代码
    dsad
    rest_framework自己总结的
  • 原文地址:https://www.cnblogs.com/AWCXV/p/11813349.html
Copyright © 2020-2023  润新知