第一题
179. 查找总价格为目标值的两个商品
本题采用前后指针和单调性规律可解;
解题思路如下:
1、设置前后指针
2、前后指针所指的两数之和大于目标数,右指针左移;
前后指针所指的两数之和小于目标数,左指针右移;
3、重复步骤二,返回一个数组,里面包含所需要的数;
class Solution {public int[] twoSum(int[] price, int target) {int left = 0,right = price.length-1,sum = 0;while (left < right){sum = price[left] + price[right];if(sum > target){right --;}else if(sum < target){left ++;}else{return new int[]{price[left],price[right]};}}return new int[]{};}
}
第二题
15. 三数之和
解题思路:本题采用左右指针和单调性的解题思路;
步骤一:
将数组从小到大序列化;
步骤二:
将数组中小于0的数字依次从左到右;列为固定值,我们所使用的目标值t是-固定值;
步骤三:
在固定值右边的数组范围内确定左右指针,如下图所示;
本题的注意事项:
一:去重
去重一:
当找到一个数组之后,左指针右移,右指针左移时,左指针移动之后所知的数值和移动之前所示的数值相同;右指针也类似有相同的情况如下图所示:
此时我们应该判断左右指针移动前后所指向的数值如果相同的话,就继续移动,知道所指前后的数字不同停止,且左指针在右指针的右边;
去重二:
当改变固定值时,如果移动一个之后固定值前后数值一样时,固定值接着向右移动一位,知道固定值数值与之前数值不一样;如下图所示:
代码如下:
class Solution {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> res = new ArrayList<>();Arrays.sort(nums);int n = nums.length;for(int i = 0;i < n; ){if(nums[i] > 0){break;}int left = i + 1,right = n - 1,t = -nums[i];while(left < right){int sum = nums[left] + nums[right];if(sum > t){right --;}else if(sum < t){left ++;}else{res.add(new ArrayList<Integer>(Arrays.asList(nums[left],nums[right],nums[i])));left ++;right --;while(left < right && nums[left]==nums[left-1]){left ++;}while(left < right && nums[right]==nums[right+1]){right --;}}}i++;while(i < n && nums[i] == nums[i-1]){i++;}}return res;}
}
第三题:
18. 四数之和
解题思路: 如三数之和故事(左右双指针和单调性)
步骤一:
将数组从小到大序列化;
步骤二:
将数组中的数字依次从左到右;列为固定值a和固定值b,我们所使用的目标值aim是taeget-两个固定值;
步骤三:
在两个固定值右边的数组范围内确定左右指针,如下图所示;
本题的注意事项:
一:去重
去重一:
当找到一个数组之后,左指针右移,右指针左移时,左指针移动之后所知的数值和移动之前所示的数值相同;
去重二:
当改变固定值b时,如果移动一个之后固定值前后数值一样时,固定值接着向右移动一位,知道固定值数值与之前数值不一样;
去重三:
当改变固定值a时,如果移动一个之后固定值前后数值一样时,固定值接着向右移动一位,知道固定值数值与之前数值不一样;
综上所述,起代码如下:
class Solution {public List<List<Integer>> fourSum(int[] nums, int target) {List<List<Integer>> res = new ArrayList<>();Arrays.sort(nums);int n = nums.length;for(int i = 0; i< n;){for(int j = i+1;j<n;){int left = j+1,right = n-1;long aim =(long)target - nums[i] - nums[j];while(left < right){int sum = nums[left] + nums[right];if(sum> aim){right --;}else if(sum < aim){left ++;}else{res.add(new ArrayList<Integer>(Arrays.asList(nums[left],nums[right],nums[i],nums[j])));left ++;right --;while(left < right && nums[left]==nums[left-1]){left ++;}while(left < right && nums[right]==nums[right+1]){right --;}}}j++;while(j < n && nums[j] == nums[j-1]){j++;}}i++;while(i < n && nums[i] == nums[i-1]){i++;}}return res;}
}
ps:本次的内容就到这里了,如果大家感兴趣话,就请一键三连哦,文章的图片是我喜欢的小偶像!!!