zoukankan      html  css  js  c++  java
  • 四数之和

    此博客链接:https://www.cnblogs.com/ping2yingshi/p/14319417.html

    四数之和

    题目链接:https://leetcode-cn.com/problems/4sum/

    题目

    给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。

    注意:

    答案中不可以包含重复的四元组。

    示例:

    给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。

    满足要求的四元组集合为:
    [
    [-1, 0, 0, 1],
    [-2, -1, 1, 2],
    [-2, 0, 0, 2]

    题解

     四数之和和三数之和一样的思路,这种题肯定不能有几个数遍历几遍数组,这样做肯定会超时,这类题目都是使用双指针,从数组的两头先取数据,然后遍历数组,判断数组中的值和双指针中数组元素的值之和是否满足条件,如果满足条件的话,则移动双指针,把左边的指针向右挪,把右边的指针向左挪,直到遍历数组结束。

    代码

    class Solution {
        public List<List<Integer>> fourSum(int[] nums, int target) {
            Arrays.sort(nums);
            List<List<Integer>> res=new ArrayList();
            int right=nums.length-1;
            for(int i=0;i<nums.length-1;i++)
            {
                 for(int j=i+1;j<nums.length;j++)
                 {
                    List<Integer> list=new ArrayList();
                     int left=j+1;
                     while(left<right)
                     {
                         if(i==0||(nums[i]!=nums[i-1]))
                         {
                             if((nums[i]+nums[j]+nums[left]+nums[right])>0)
                             {
                                 right--;
                             }
                            if((nums[i]+nums[j]+nums[left]+nums[right])<0)
                             {
                                 left++;
                             }
                             else
                             {
                                 list.add(nums[i]);
                                 list.add(nums[j]);
                                 list.add(nums[left]);
                                 list.add(nums[right]);
                                 res.add(list);
                                
                                 while(nums[left]==nums[left-1])left++;
                                 while(nums[right]==nums[right-1])right--;
                                  left++;
                                 right--;
                             }
                             
                         }
                         if(nums[i]==nums[j]){
                             i++;
                         }
                     }
                 }
            }
            return res;
        }
    }

    结果

    我感觉我代码没有什么问题,但是结果不对,目前还没有找到原因,明天在eclipse中调试一下。

    出来混总是要还的
  • 相关阅读:
    Sequelize框架:
    sequelize 测试
    sequelize 用于PostgreSQL,MySQL,SQLite和MSSQL的Node.js / io.js ORM
    node Util 模块
    bluebird的安装配置
    bluebird 开发文档链接
    Node.js的__dirname,__filename,process.cwd(),./的含义
    editplus
    luogu3377 【模板】左偏树(可并堆)
    cf936c Lock Puzzle
  • 原文地址:https://www.cnblogs.com/ping2yingshi/p/14319417.html
Copyright © 2011-2022 走看看