考试结束,班级平均分只拿到了年级第二,班主任于是问道:大家都知道世界第一高峰珠穆朗玛峰,有人知道世界第二高峰是什么吗?正当班主任要继续发话,只听到角落默默想起来一个声音:”乔戈里峰”
前言
2018.11.20号打卡今天的题目leetcode61:
昨天的题解
题目
每天一道leetcode18- 四数之和
题目详述
给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。
题目详解
思路
这个题目和昨天的挺像的,就在昨天的代码改了改就AC了
先sort一下array,为啥要sort呢,因为要用到two pointers 来遍历找两数之和,只有在从小到大排序之后的结果上,才能根据情况移动left 和right。
首先是如果数组只有4个数字,直接判断4个数的和是不是target;(最少4个数)
当确定好了第一个数字和第二个数字以后,如何确定?一个从开头开始,begin,是外层循环,一个从末尾往前遍历,end,是内层循环(要注意,必须间隔两个数,因为要取4个数)
就在剩下的array里找找两个数,left从begin+1开始,right从end-1开始往前遍历,取4个数的和得到tempSum,比较这个tempSum是不是等于target,如果是target,则把这个结果保存下来(这里注意先把结果存到hashSet里面,去重)
之后如果tempSum与target不相等 利用two pointers 特性, 如果tempSum 比target 小的话,说明我们需要更大的sum,所以要让left++以便得到更大的sum。 如果tempSum 比target 大的话,我们就需要更小的sum,所以right--。
1class Solution {
2 public List<List<Integer>> fourSum(int[] nums, int target) {
3 HashSet<List<Integer>> set = new HashSet<>();
4 List<List<Integer>> result = new ArrayList<>();
5 if(nums.length == 4)
6 {
7 if(nums[0] + nums[1] + nums[2] + nums[3] == target)
8 {
9 List<Integer> temp = new ArrayList<>();
10 temp.add(nums[0]);
11 temp.add(nums[1]);
12 temp.add(nums[2]);
13 temp.add(nums[3]);
14 result.add(temp);
15 return result;
16 }
17 return result;
18 }
19 Arrays.sort(nums);
20 for(int begin = 0;begin < nums.length-3;begin++)
21 {
22 for(int end = nums.length-1;end - begin > 2;end--)
23 {
24 int left = begin + 1;
25 int right = end - 1;
26 while(left < right)
27 {
28 int tempSum = nums[begin] + nums[end] + nums[left] + nums[right];
29 if(tempSum == target)
30 {
31 List<Integer> temp = new ArrayList<>();
32 temp.add(nums[begin]);
33 temp.add(nums[left]);
34 temp.add(nums[right]);
35 temp.add(nums[end]);
36 set.add(temp);
37 left++;
38 }else if(tempSum < target)
39 left++;
40 else
41 right--;
42 }
43 }
44 }
45 for(List<Integer> t: set)
46 result.add(t);
47 return result;
48 }
49}
代码讲解
5-18行就是如果数组长度是4,那么直接判断数组和是不是target,如果是target则返回这个,不是返回空
19行对nums进行排序
20-22行就是先确定好两个数,一个begin一个end,注意间隔end-begin>2的哦~
26-37行就是判断这4个数的和tempSum是不是target,如果是target那么就填入到hashset中
38-41行就是之后如果tempSum与target不相等 利用two pointers 特性, 如果tempSum 比target小的话,说明我们需要更大的sum,所以要让left++以便得到更大的sum。 如果tempSum 比0 大的话,我们就需要更小的sum,所以right--。
45-47行 遍历这个set然后加入到List中,把它返回。
结束语
2018.11.20号打卡
关于本号
作者乔戈里亲历2019秋招,哈工大计算机本硕,百度java工程师,欢迎大家关注我的微信公众号:程序员乔戈里,公众号有3T编程资源,以及我和我朋友(百度C++工程师)在秋招期间整理的近200M的面试必考的java与C++面经,并有每天一道leetcode打卡群与技术交流群,欢迎关注。
3T编程资料等你来拿