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中调试一下。

    出来混总是要还的
  • 相关阅读:
    c#之静态构造函数和单例模式
    ugui之圆角矩形头像实现
    一些网站
    unity3d之实现各种滑动效果
    unity3d之切换场景不销毁物体
    unity3d之技能栏冷却
    unity3d之控制人物转向移动并播放动画
    vs常用快捷键
    构造函数的继承
    编写可维护的javascript 随笔
  • 原文地址:https://www.cnblogs.com/ping2yingshi/p/14319417.html
Copyright © 2011-2022 走看看