算法day03

第一题

179. 查找总价格为目标值的两个商品


本题采用前后指针和单调性规律可解;

解题思路如下:

1、设置前后指针

2、前后指针所指的两数之和大于目标数,右指针左移;

前后指针所指的两数之和小于目标数,左指针右移;

3、重复步骤二,返回一个数组,里面包含所需要的数;

java 复制代码
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是-固定值;

步骤三:

在固定值右边的数组范围内确定左右指针,如下图所示;

本题的注意事项:

一:去重

去重一:

当找到一个数组之后,左指针右移,右指针左移时,左指针移动之后所知的数值和移动之前所示的数值相同;右指针也类似有相同的情况如下图所示:

此时我们应该判断左右指针移动前后所指向的数值如果相同的话,就继续移动,知道所指前后的数字不同停止,且左指针在右指针的右边;

去重二:

当改变固定值时,如果移动一个之后固定值前后数值一样时,固定值接着向右移动一位,知道固定值数值与之前数值不一样;如下图所示:

代码如下:

java 复制代码
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时,如果移动一个之后固定值前后数值一样时,固定值接着向右移动一位,知道固定值数值与之前数值不一样;

综上所述,起代码如下:

java 复制代码
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:本次的内容就到这里了,如果大家感兴趣话,就请一键三连哦,文章的图片是我喜欢的小偶像!!!

相关推荐
小猿_001 小时前
C语言指针进阶
c语言·数据结构·算法
摆烂仙君3 小时前
小米2025年校招笔试真题手撕(二)
算法
xin007hoyo7 小时前
算法笔记·数学·最大公约数
笔记·算法
丶Darling.7 小时前
Day126 | 灵神 | 二叉树 | 层数最深的叶子结点的和
数据结构·c++·算法·二叉树·深度优先
小O的算法实验室8 小时前
2025年ESWA SCI1区TOP,离散人工蜂群算法+多农场多除草机器人任务分配,深度解析+性能实测
算法·智能算法改进
2401_859049089 小时前
Git使用
arm开发·git·stm32·单片机·mcu·算法
冠位观测者9 小时前
【Leetcode 每日一题】2942. 查找包含给定字符的单词
算法·leetcode·职场和发展
蓝心湄10 小时前
C语言-枚举
c语言·开发语言·算法
轮到我狗叫了10 小时前
力扣小题, 力扣113.路径总和II力扣.111二叉树的最小深度 力扣.221最大正方形力扣5.最长回文子串更加优秀的算法:中心扩展算法
算法·leetcode·深度优先
黎明smaly10 小时前
【C语言】复习~数组和指针
c语言·开发语言·数据结构·c++·leetcode