算法day03

news2024/10/5 14:15:19

第一题 

 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.coloradmin.cn/o/1658338.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3D 打印为压铸行业的带来新动力

近年来&#xff0c;随着多家车企的积极引领&#xff0c;一体化压铸技术已逐渐成为汽车行业的一大趋势。该技术不仅简化了车身的制造流程&#xff0c;而且优化了供应链环节&#xff0c;成为汽车制造业中的一次创新&#xff0c;同时显著提升了经济效益。 压铸技术&#xff0c;简而…

excel中怎么跳转到指定的单元格?

也许你会有这样的需求&#xff0c;如A1单元格中显示B100这种单元格地址&#xff0c;怎么做以点一下就跳转到B100&#xff1f; 一、设置公式 B1HYPERLINK("#"&MID(CELL("FILENAME",A1),FIND("]",CELL("FILENAME",A1))1,99)&&…

echart 多表联动value为null时 tooltip 显示问题

两个图表&#xff0c;第一个有tooltip,第二个隐藏掉 两个图表的 series 如下 // ----- chart1 ----series: [{name: Union Ads,type: line,stack: Total,data: [320, 282, 391, 334, null, null, null],},{name: Email,type: line,stack: Total,data: [220, 232, 221, 234, 29…

现货黄金流程到何种程度?现货黄金在金融产品中的占比是多少?

踏入2024年以来&#xff0c;受美联储降息以及地缘局势紧张的影响&#xff0c;美元受压&#xff0c;避险情绪高涨&#xff0c;众多因素影响下黄金价格出现了强势的上涨&#xff0c;屡创历史新高。在上涨如此强劲的背景下&#xff0c;投资者希望通过黄金投资来实现资产增值。市场…

锁相环(PLL)经典书籍分享(可下载)

锁相环&#xff08;PLL&#xff09;作为一种确保系统同步的控制机制&#xff0c;广泛应用于频率合成、时钟恢复、信号调制与解调等多个方面。 探索锁相环&#xff08;PLL&#xff09;技术的深度和广度&#xff0c;最有效的途径之一便是通过专业书籍的系统学习。以下是为渴望掌…

每日OJ题_贪心算法三⑦_力扣991. 坏了的计算器

目录 力扣991. 坏了的计算器 解析代码 力扣991. 坏了的计算器 991. 坏了的计算器 难度 中等 在显示着数字 startValue 的坏计算器上&#xff0c;我们可以执行以下两种操作&#xff1a; 双倍&#xff08;Double&#xff09;&#xff1a;将显示屏上的数字乘 2&#xff1b;递…

英伟达推出视觉语言模型:VILA

NVIDIA和MIT的研究人员推出了一种新的视觉语言模型(VLM)预训练框架&#xff0c;名为VILA。这个框架旨在通过有效的嵌入对齐和动态神经网络架构&#xff0c;改进语言模型的视觉和文本的学习能力。VILA通过在大规模数据集如Coy0-700m上进行预训练&#xff0c;采用基于LLaVA模型的…

Core Impact 21.5 (Windows) - 高级渗透测试

Core Impact 21.5 (Windows) - 高级渗透测试 Fortra | Core Security Penetration testing software, Release Feb 2024 请访问原文链接&#xff1a;Core Impact 21.5 (Windows) - 高级渗透测试&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&…

多线程学习Day07

共享模型之不可变 从一个日期转换的问题开始 Slf4j(topic "c.Test1") public class Test1 {public static void main(String[] args) {SimpleDateFormat sdf new SimpleDateFormat("yyyy-MM-dd");for (int i 0; i < 10; i) {new Thread(() -> {…

20K薪资要什么水平?来看看25岁测试工程师的面试过程…_测试工程师薪资20k(2)

既有适合小白学习的零基础资料&#xff0c;也有适合3年以上经验的小伙伴深入学习提升的进阶课程&#xff0c;涵盖了95%以上软件测试知识点&#xff0c;真正体系化&#xff01; 由于文件比较多&#xff0c;这里只是将部分目录截图出来&#xff0c;全套包含大厂面经、学习笔记、…

无监督式学习

1.是什么&#xff1f; 无监督式学习与监督式学习**最大的区别就是&#xff1a;**没有事先给定的训练实例&#xff0c;它是自动对输入的示例进行分类或者分群&#xff1b; 优点&#xff1a;不需要标签数据&#xff0c;极大程度上扩大了我们的数据样本&#xff0c;其次不受监督信…

华为云CodeArts API专场直播来袭!——探索API全生命周期管理新趋势

API的全生命周期管理是否让你摸不清头脑&#xff1f;你是否对API的前沿技术和应用充满了好奇&#xff0c;渴望一探究竟&#xff1f; 华为云PaaS服务即将在5月10日16:00&#xff0c;为你带来一场别开生面的CodeArts API专场直播活动&#xff01; 你可以在轻松愉快的氛围中&…

Python网络编程 03 实验:FTP详解

文章目录 一、小实验FTP程序需求二、项目文件架构三、服务端1、conf/settings.py2、conf/accounts.cgf3、conf/STATUS_CODE.py4、启动文件 bin/ftp_server.py5、core/main.py6、core/server.py 四、客户端1、conf/STATUS_CODE.py2、bin/ftp_client.py 五、在终端操作示例 一、小…

【CTF-Crypto】RSA-选择明密文攻击 一文通

RSA&#xff1a;选择明密文攻击 关于选择明/密文攻击&#xff0c;其实这一般是打一套组合拳的&#xff0c;在网上找到了利用的思路&#xff0c;感觉下面这个题目是真正将这个问题实现了&#xff0c;所以还是非常棒的一道题&#xff0c;下面先了解一下该知识点&#xff1a;(来自…

Telegram Premium会员有什么功能?

Telegram Premium 是 Telegram 的付费版本&#xff0c;现已上线。付费版本被定位为帮助运行平台并进一步开发它的一种方式。但除此之外&#xff0c;它对你有什么好处&#xff1f;以下是Telegram Premium中包含的八个主要功能&#xff1a; 1.没有广告。 Telegram Premium是无广…

李飞飞团队 AI4S 最新洞察:16 项创新技术汇总,覆盖生物/材料/医疗/问诊……

不久前&#xff0c;斯坦福大学 Human-Center Artificial Intelligence (HAI) 研究中心重磅发布了《2024年人工智能指数报告》。 作为斯坦福 HAI 的第七部力作&#xff0c;这份报告长达 502 页&#xff0c;全面追踪了 2023 年全球人工智能的发展趋势。相比往年&#xff0c;扩大了…

[Linux]如何在Ubuntu 22.04系統安裝Node-red?

Node-red是一個建立在Node.js上的視覺化程式設計工具&#xff0c;其常見的應用情境為建置或轉換各項硬體之間的通信協定的物聯網或工聯網場域&#xff0c;其可藉由設置來安裝第三方應用模組來建置多樣的通信協定節點&#xff0c;包含modbus in/out, mqtt in/out, websocket in/…

Java数组创建与使用

一.创建和初始化 1.数组是怎么创建的&#xff1f; 直接举例子&#xff1a; int[] arr new int[10]; 这里只简单的举一个int开辟数组的例子。 可见java数组的创建于C语言是不同的。前面是一个int[ ]就是一个数组的数据类型&#xff0c;后面的arr是数组名&#xff0c;最后[…

【代码随想录——栈与队列】

1.栈和队列理论基础 栈和队列的原理大家应该很熟悉了&#xff0c;队列是先进先出&#xff0c;栈是先进后出。 2.用栈实现队列 type MyQueue struct {head []intheadSize intstore []intstoreSize int }func Constructor() MyQueue {return MyQueue{head : make([]int,100),h…

《ESP8266通信指南》11-Lua开发环境配置

往期 《ESP8266通信指南》10-MQTT通信&#xff08;Arduino开发&#xff09;-CSDN博客 《ESP8266通信指南》9-TCP通信&#xff08;Arudino开发&#xff09;-CSDN博客 《ESP8266通信指南》8-连接WIFI&#xff08;Arduino开发&#xff09;&#xff08;非常简单&#xff09;-CSD…