双指针问题2

文章目录

  • 1. 有效三角形的个数(611)
  • 2. 查找总价格为目标值的两个商品(LCR179)
  • 3. 三数之和(15)
  • 4. 四数之和(18)


1. 有效三角形的个数(611)

题目描述:
在这里插入图片描述

算法原理:
这题使用的方法要进行理解首先要知道一个比较基础的数学知识就是三角形的三条边当中只要最短的那两条边的和大于第三条边那么这三条边就是可以构成三角形的,具体原因就不阐述了其实也很简单。
知道了这个数学知识我们首先要做的就是将数组进行升序排序,以此来方便我们后续进行操作。我们从数组的最后一个元素开始遍历到数组的2下标的元素,这个元素位置记为i,事实上可以使用for循环完成这个遍历。然后对于i位置元素的左边的数组元素进行分析,在for循环内部定义left指针指向0位置,right指针指向i-1位置。因为我们将nums[i]的值视为第三条边的长度,nums[left]和nums[right]视为第一条边和第二条边的长度,那么此时分为两种情况。
第一种情况就是nums[left]+nums[right]>nums[i]那么此时是可以构成三角形的,因为nums[left]加上nums[right]都可以大于nums[i],显然在nums数组的left+1~right-1下标的元素加上nums[right]都会大于nums[i],也就是可以构成三角形,所以我们无需去遍历这个区间内的元素就可以直接得到在固定三角形第二条边和第三条边长度的情况下有多少种不同可以构成三角形的三元组,最终将right–,并且将最终返回的ret也就是返回的可以构成三角形的三元组的个数加上right-left。
第二种情况就是nums[left]+nums[right]<=nums[i]那么此时是不可以构成三角形的,因为此时连nums[right]加上nums[left]都已经小于nums[i],显然在nums数组的left+1~right-1下标的元素加上nums[left]都会小于nums[i],也就是不可以构成三角形,所以也是一样我们无需去遍历这个区间内的元素直接跳过即可,最终将left++。
重复以上两种情况的判断,直至right和left相遇,这相当于在开始的for循环中再去写一个循环去处理nums数组的0~i-1这个区间,具体逻辑如代码所示。
代码如下:

class Solution {
    public int triangleNumber(int[] nums) {
        int n = nums.length;
        Arrays.sort(nums);
        int ret = 0;
        for (int i = n - 1; i >= 2; i--) {
            int left = 0;
            int right = i - 1;
            while (left < right) {
                int temp = nums[left] + nums[right];
                if (temp > nums[i]) {
                    ret += right - left;
                    right--;
                } else {
                    left++;
                }
            }
        }
        return ret;
    }
}

题目链接

2. 查找总价格为目标值的两个商品(LCR179)

题目描述:
在这里插入图片描述

算法原理:
其实这一题是可以使用二分查找直接做出来的,但是在学习一种方法的时候就要尽量多的去使用它,从而逐渐熟练,因此这里使用双指针的方法。跟上题使用相似的思想,就是定义left和right指针来不断缩小区间范围,满足条件跳出循环然后返回一种结果即可。
代码如下:

class Solution {
    public int[] twoSum(int[] price, int target) {
        int right = price.length - 1;
        int left = 0;

        while (left < right) {
            if (price[left] + price[right] > target) {
                right--;
            } else if (price[left] + price[right] < target) {
                left++;
            } else {
                break;
            }
        }

        return new int[] { price[left], price[right] };
    }
}

题目链接

3. 三数之和(15)

题目描述:
在这里插入图片描述

算法原理:
这一题也是和前面的思想类似,不过这里需要先给数组排序得到升序的数组,然后固定住第三个数nums[i](这里的i可以取2到nums.length-1,2是因为至少要留两个值作为前两个数),在0到i-1这个区间内去找到两个值满足nums[left]+nums[right]=-nums[i],这一题就转化为和第一题一致的题目,就可以使用做第一题使用的方法甚至说代码都可以直接套用。但是不同的一点在于,第一题得到的三元组可以重复,但是这一题不可以,所以我们要进行去重,在找到符合条件的三元组后left和right指针移动之后要判断该位置元素和前一个是否相同,如果相同就直接跳过不同就可以继续进行处理,当然这里的跳过过程要注意越界的问题。我们对于固定的第三个数也要进行去重,道理也是一样,就是i进行移动后,要判断当前位置元素和前一个是否相同,如果相同直接跳过,这样就完成了去重。
代码如下:

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        int n = nums.length;
        Arrays.sort(nums);
        List<List<Integer>> retList = new ArrayList<>();

        for (int i = n - 1; i >= 2; i--) {
            int left = 0;
            int right = i - 1;
            while (right > left) {
                int sum = nums[left] + nums[right];
                if (sum > -nums[i]) {
                    right--;
                } else if (sum < -nums[i]) {
                    left++;
                } else {
                    retList.add(new ArrayList(Arrays.asList(nums[left], nums[right], nums[i])));
                    left++;
                    right--;
                    while (left < right && nums[left] == nums[left - 1]) {
                        left++;
                    }
                    while (right > left && nums[right] == nums[right + 1]) {
                        right--;
                    }
                }
            }
            while (i > 1 && nums[i] == nums[i-1]) {
                i--;
            }
        }
        return retList;
    }
}

题目链接

4. 四数之和(18)

题目描述:
在这里插入图片描述

算法原理:
这题和上一题三数之和就是一致的,但是就是这里要多套一层循环去多固定一个数,也就是通过两层循环固定两个数分别为nums[i]和nums[j],然后根据题意nums[left]+nums[right]需要满足target-nums[i]-nums[j]这样的条件。另外就是也需要去重,相比三数之和就是多对一层循环去一次重。
代码如下:

class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        List<List<Integer>> list = new ArrayList();
        Arrays.sort(nums);
        int n = nums.length;
        for (int i = n - 1; i > 2;) {
            for (int j = i - 1; j > 1;) {
                int left = 0;
                int right = j - 1;
                long aim =  (long)target - nums[i] - nums[j];
                while (left < right) {
                    int temp = nums[left] + nums[right];
                    if (temp > aim) {
                        right--;
                    } else if (temp < aim) {
                        left++;
                    } else {
                        list.add(new ArrayList(Arrays.asList(nums[left], nums[right], nums[j], nums[i])));
                        left++;
                        right--;
                        while (left < right && nums[left - 1] == nums[left]) {
                            left++;
                        }
                        while (left < right & nums[right + 1] == nums[right]) {
                            right--;
                        }
                    }
                }
                j--;
                while (j > 1 && nums[j + 1] == nums[j]) {
                    j--;
                }
            }
            i--;
            while (i > 2 && nums[i + 1] == nums[i]) {
                i--;
            }
        }
        return list;
    }
}

题目链接

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Stable Diffusion初体验——基于机器学习通过神经网络的强大AI平台

文章目录 前言最新热门活动&#xff01;&#xff01;平台介绍 一.创建应用 Stable Diffusion WebUI初始化上传模型&#xff0c;VAE&#xff0c;lora 介绍sd模型&#xff0c;vae&#xff0c;lora模型进入应用文生图工作区调参区图生图 结语小程序活动——6.20火热上线&#x1f5…

消息队列MQ相关面试题

消息队列MQ相关面试题 1 RabbitMQ 1.1 你们项目中哪里用到了RabbitMQ ? 难易程度&#xff1a;☆☆☆ 出现频率&#xff1a;☆☆☆☆ 我们项目中很多地方都使用了RabbitMQ , RabbitMQ 是我们项目中服务通信的主要方式之一 , 我们项目中服务通信主要有二种方式实现 : 通过Fei…

阿里云服务器618没想到这么便宜,买早了!

2年前&#xff0c;我买了个服务器&#xff0c;租用服务器&#xff08;ECS5&#xff09;和网络宽带&#xff08;1M&#xff09;&#xff0c;可以说是非常非常低的配置了。 当时5年的折扣力度最大&#xff0c;但是打完折后&#xff0c;价格依然要近3000多元。 最近看到阿里云618活…

LVGL8.3动画图像(太空人)

LVGL8.3 动画图像 1. 动画图像本质 我们知道电影属于视频&#xff0c;而电影的本质是将一系列动作的静态图像进行快速切换而呈现出动画的形式&#xff0c;也就是说动画本质是一系列照片。所以 lvgl 依照这样的思想而定义了动画图像&#xff0c;所以在 lvgl 中动画图像类似于普…

element-plus 表单组件 之element-form

elment-plus的表单组件的标签有el-form,el-form-item。 单个el-form标签内包裹若干个el-form-item,el-form-item包裹具体的表单组件&#xff0c;如输入框组件&#xff0c;多选组件&#xff0c;日期组件等。 el-form组件的主要作用是&#xff1a;提供统一的布局给其他表单组件&…

setInterval 定时任务执行时间不准验证

一般在处理定时任务的时候都使用setInterval间隔定时调用任务。 setInterval(() > {console.log("interval"); }, 2 * 1000);我们定义的是两秒执行一次&#xff0c;但是浏览器实际执行的间隔时间只多不少。这是由于浏览器执行 JS 是单线程模式&#xff0c;使用se…

apksigner jarsigner.md

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、apksigner3.2 为 APK 签名3.3 验证…

电商爬虫API的定制开发:满足个性化需求的解决方案

一、引言 随着电子商务的蓬勃发展&#xff0c;电商数据成为了企业决策的重要依据。然而&#xff0c;电商数据的获取并非易事&#xff0c;特别是对于拥有个性化需求的企业来说&#xff0c;更是面临诸多挑战。为了满足这些个性化需求&#xff0c;电商爬虫API的定制开发成为了解决…

2024年综合艺术与媒体传播国际会议(ICIAMC 2024)

2024年综合艺术与媒体传播国际会议(ICIAMC 2024) 2024 International Conference on Integrated Arts and Media Communication (ICIAMC 2024) 会议地点&#xff1a;贵阳&#xff0c;中国 网址&#xff1a;www.iciamc.com 邮箱: iciamcsub-conf.com 投稿主题请注明:ICIAMC…

使用AGG里面的clip_box函数裁剪画布, 绘制裁剪后的图形

// 矩形裁剪图片, 透明 void agg_testImageClipbox_rgba32(unsigned char* buffer, unsigned int width, unsigned int height) {// 创建渲染缓冲区 agg::rendering_buffer rbuf;// BMP是上下倒置的&#xff0c;为了和GDI习惯相同&#xff0c;最后一个参数是负值。rbuf.attach…

使用API有效率地管理Dynadot域名,为文件夹中的域名统一设置whois信息

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

基于SSM+Vue+微信小程序的大学生就业平台系统+毕业论文

项目包含前台和后台两部分&#xff1a;多角色登录&#xff0c;功能完善&#xff0c;界面优美 前台主要功能实现&#xff1a;首页列表查看、求职信息管理、简历管理、面试邀请管理、个人中心等 后台主要功能实现&#xff1a;首页、个人中心、学生管理、企业管理、企业类型管理…

若依 ruoyi 显示隐藏搜索框 显示隐藏列

一、 显示隐藏搜索框 页面搜索关键字 showSearch&#xff0c;设置是否显示 隐藏&#xff1a; 显示&#xff1a; 二、自定义设置 显示隐藏列 1. 页面搜索关键字 right-toolbar&#xff0c;新增&#xff1a; :columns"columns" 2. js下 data(){return{}}中新增&am…

如何覆盖!important修饰的属性

最简单的方法 如果这个!important修饰的属性 是自己的写的&#xff0c;去掉这种写法&#xff0c;使用优先级的方式来写这个属性&#xff08;.outter .inner 的优先级就会比 。outter的优先级高&#xff09; 复杂的方法&#xff1a;用魔法打败魔法 但是这个样式来自于全局css&am…

【计算机毕业设计】185餐厅点餐微信小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

百度网盘的文件该怎么整理?不如试试这个整理工具

科学的文件架构 一键生成文件夹层级工具 极具妥帖的秩序感受 又是一周&#xff0c;好久不见&#xff0c;正琢磨着这次给大家带来点什么好东西&#xff0c;突然百度网盘的整理让我头疼不已&#xff0c;从我记事以来&#xff0c;这网盘已经整理过N遍了&#xff0c;总是乱了整理…

【权威出版/投稿优惠】2024年水利水电与能源环境科学国际会议(WRHEES 2024)

2024 International Conference on Water Resources, Hydropower, Energy and Environmental Science 2024年水利水电与能源环境科学国际会议 【会议信息】 会议简称&#xff1a;WRHEES 2024 大会时间&#xff1a;点击查看 截稿时间&#xff1a;点击查看 大会地点&#xff1a;…

day2-web安全漏洞攻防-基础-弱口令、HTML注入(米斯特web渗透测试)

day2-web安全漏洞攻防-基础-弱口令、HTML注入&#xff08;米斯特web渗透测试&#xff09; 1&#xff0c;漏洞2&#xff0c;弱口令3&#xff0c;爆破&#xff08;1&#xff09;Burpsuite&#xff08;2&#xff09;攻击类型 4&#xff0c;HTML针剂注入 1&#xff0c;漏洞 挖掘和利…

DataStructure.时间和空间复杂度

时间和空间复杂度 【本节目标】1. 如何衡量一个算法的好坏2. 算法效率3. 时间复杂度3.1 时间复杂度的概念3.2 大O的渐进表示法3.3 推导大O阶方法3.4 常见时间复杂度计算举例3.4.1 示例13.4.2 示例23.4.3 示例33.4.4 示例43.4.5 示例53.4.6 示例63.4.7 示例7 4.空间复杂度4.1 示…

【Java】pcm 与 wav 格式互转工具类 (附测试用例)

文章目录 1. 前言1.1 背景1.2 目标1.3 亮点 2. 用例说明3. 补充验证4. 相关链接 1. 前言 git 仓库 https://github.com/ChenghanY/pcm-wav-converter 1.1 背景 系统新接入语音引擎。 语音引擎只认 pcm 格式数据。前端只认 wav 格式 。 需要后端对 pcm 和 wav 格式实现互转&a…