算法day03

第一题 

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/682352.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 147. 对链表进行插入排序

目录 1.原题链接&#xff1a; 2.从前往后插入结点&#xff1a; 代码实现&#xff1a; 3.提交结果&#xff1a; 4.读书分享&#xff1a; 1.原题链接&#xff1a; 147. 对链表进行插入排序 2.从前往后插入结点&#xff1a; 对于本题&#xff0c;我们可以以头结点作为参考…

java线程

程序&#xff0c;进程&#xff0c;线程 程序是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码。 进程是指正在内存中运行的应用程序&#xff0c;如运行中的QQ。音乐播放器等。进程是操作系统进行资源分配的最小单位。 线程&#xff1a;进程可进一步细…

光峰科技2023年营收、净利润均双位数下滑,新一年延续?

近日&#xff0c;深圳光峰科技股份有限公司&#xff08;688007.SH&#xff0c;下称“光峰科技”&#xff09;对外公布了2023年和2024年一季度的经营“成绩单”。 透视财报不难看出&#xff0c;虽然光峰科技在降低成本、提振销售等层面下足了功夫&#xff0c;但受制于市场需求式…

GStreamer日志调试笔记

1、查询所有分类 #gst-launch-1.0 --gst-debug-help 2、查询videotestsrc的日志 #gst-launch-1.0 --gst-debug-help | findstr videotestsrc 结果&#xff1a; 3、使用--gst-debug设置相应日志类型的相应等级&#xff0c;越大显示日志越多&#xff0c;排查内存泄露可以设置为9 …

DDD领域驱动模型设计

醍醐灌顶了朋友们 第一次写ddd还是 一路走来 丢失了东西 现在倒是也能找回来 只是有点可惜了 选择比努力更重要 独立功能 应用层&#xff1a;组织业务逻辑 领域&#xff1a;实体对象领域&#xff0c;业务核心 数据仓库&#xff1a; 不影响业务封装了数据操作&#xff0c;…

一年十倍最重要的一点是:知止者胜

一年十倍的操作并不适合大资金投资者&#xff08;200万元以上&#xff09;&#xff0c;所谓船小好掉头&#xff0c;大资金开仓数量较多&#xff0c;如果日内交易很容易出现无法及时按预定数量开仓&#xff0c;以及无法顺利进行平仓的麻烦。这样就使得资金更难实现预期赢利&…

C语言leetcode刷题笔记1

C语言leetcode刷题笔记1 第1题&#xff1a;136.只出现一次的数字两次遍历&#xff08;O(numsSize^2)&#xff09;位运算 第2题&#xff1a;202.快乐数快慢指针记录历史数据 第3题&#xff1a;53.最大子数组和暴力求解&#xff08;超时&#xff09;动态规划分治 第1题&#xff1…

端口占用解决方法

1、查询端口 打开cmd命令提示符窗口&#xff0c;输入以下指令查询所有端口 netstat -ano //查询所有端口 netstat -ano|findstr 8080 //查询指定端口 2、杀死进程 taskkill /t /f /im 进程号(PID)

每日OJ题_记忆化搜索⑤_力扣329. 矩阵中的最长递增路径

目录 力扣329. 矩阵中的最长递增路径 解析代码1_爆搜递归&#xff08;超时&#xff09; 解析代码2_记忆化搜索 力扣329. 矩阵中的最长递增路径 329. 矩阵中的最长递增路径 难度 困难 给定一个 m x n 整数矩阵 matrix &#xff0c;找出其中 最长递增路径 的长度。 对于每…

如何预防最新的Mallox变种rmallox勒索病毒感染您的计算机?

导言&#xff1a; 在数字化浪潮中&#xff0c;网络安全如履薄冰。新兴的.rmallox勒索病毒&#xff0c;以其独特的攻击方式和狡猾的战术&#xff0c;给全球网络安全带来了前所未有的挑战。本文将深入剖析.rmallox勒索病毒的战术&#xff0c;并提出一系列创新的防御策略&#xf…

Windows系统下修改文件夹和U盘图标实战

文章目录 知识学习一、修改磁盘图标第一步、新建.INF文件第二步、放置图标第三步、重新插入U盘第四步、隐藏与显示文件知识拓展 二、修改文件夹图标设置图标样式恢复图标样式 在日常办公中使用的是windows系统&#xff0c;系统默认的文件图标都一样&#xff0c;不利于分类整理&…