• LeetCode 18. 4Sum


    LeetCode 18. 4Sum (四数之和)

    题目

    链接

    https://leetcode-cn.com/problems/4sum/

    问题描述

    给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):

    0 <= a, b, c, d < n
    a、b、c 和 d 互不相同
    nums[a] + nums[b] + nums[c] + nums[d] == target
    你可以按 任意顺序 返回答案 。

    示例

    输入:nums = [1,0,-1,0,-2,2], target = 0
    输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]

    提示

    1 <= nums.length <= 200
    -109 <= nums[i] <= 109
    -109 <= target <= 109

    思路

    和三数之和一个思路,前两个采用循环,第三四个采用双指针。

    复杂度分析

    时间复杂度 O(n3)
    空间复杂度 O(n)
    

    代码

    Java

        public List<List<Integer>> fourSum(int[] nums, int target) {
            HashSet<List<Integer>> all = new HashSet<>();
            ArrayList<List<Integer>> ans = new ArrayList<>();
            Arrays.sort(nums);
            int n = nums.length;
    
            if (n < 4) {
                return ans;
            }
            for (int i = 0; i < n - 3; i++) {
                for (int j = i + 1; j < n - 2; j++) {
                    int sum = nums[i] + nums[j];
                    int left = j + 1;
                    int right = n - 1;
                    while (left < right) {
                        int tmpsum = sum + nums[left] + nums[right];
                        if (tmpsum == target) {
                            List<Integer> tmp = new ArrayList<>();
                            tmp.add(nums[i]);
                            tmp.add(nums[j]);
                            tmp.add(nums[left++]);
                            tmp.add(nums[right--]);
                            tmp.sort(new Comparator<Integer>() {
                                @Override
                                public int compare(Integer o1, Integer o2) {
                                    return o1 - o2;
                                }
                            });
                            all.add(tmp);
                        } else if (tmpsum < target) {
                            left++;
                        } else {
                            right--;
                        }
                    }
                }
    
            }
            Iterator<List<Integer>> iterator = all.iterator();
            while (iterator.hasNext()) {
                ans.add(iterator.next());
            }
            return ans;
        }
    
  • 相关阅读:
    Django的自关联
    Django的登录模块
    Django和SQL语句的对应参考
    Django 内置分页的写法
    Django 自定义分页
    经典语句,看看让心灵宁静
    《此生未完成》读后感
    JavaScript杂谈(顺便也当知识积累)
    我总结的js性能优化的小知识
    我总结的js方面你可能不是特别清楚的小知识
  • 原文地址:https://www.cnblogs.com/blogxjc/p/16186871.html
Copyright © 2020-2023  润新知