算法之路(一)

🖊作者 : D. Star.
📘专栏 :算法小能手
😆今日分享 : 如何学习?
在学习的过程中,不仅要知道如何学习,还要知道避免学习的陷阱。1. 睡眠不足;2. 被动学习和重读;3. 强调标记或画线,仅仅是强调标记或画下大段课本内容并不会让你的头脑记住任何东西;4. 偷看问题的答案并且认为自己已经理解了;5. 填鸭式学习;6. 忽视书本,只做习题;7. 分心;8. 不去弄清楚你没理解的知识点;9. 惰性学习,只是学习简单的知识。避开这 9 个陷阱,同时破解掉陷阱,你就会找到学习的方法,提高你的成绩。在学习的过程中,不仅要知道如何学习,还要知道避免学习的陷阱。
在这里插入图片描述

文章目录

  • 1. 力扣的283题--移动零
    • ✔解题思路
    • ✔具体代码如下:
    • ✔总结
  • 2. 力扣的1089题--复写零
    • ✔解题思路:
    • ✔具体代码如下:
    • ✔总结:
  • 3. 力扣的11题--盛最多水的容器
    • ✔ 解题思路:
    • ✔具体代码如下:
    • ✔总结:
  • 4. 力扣611题-- 有效三角形的个数
    • ✔解题思路:
    • ✔具体代码如下:
    • ✔总结:
  • 5.力扣15题--三数之和
    • ✔解题思路:
    • ✔具体代码如下:
    • ✔总结:
  • 6. 力扣18题--四数之和
    • ✔解题思路:
    • ✔具体代码如下:
    • ✔总结:
    • 感谢家人的阅读,不准确的地方 欢迎在评论区指正!

1. 力扣的283题–移动零

做题链接:力扣的283题

✔解题思路

在这里插入图片描述

✔具体代码如下:

    public void moveZeroes(int[] nums) {
        int cur = 0;//指向当前遍历位置--”0“段的下一个
        int dest = 0;//指向非”0“段的末端
        while(cur<nums.length){
            if(nums[cur] == 0){
                cur++;
            }else{
                //交换dest+1和cur
                int tmp = nums[cur];
                nums[cur] = nums[dest];
                nums[dest] = tmp;
                dest++;cur++;
            }
        }
    }

✔总结

2. 力扣的1089题–复写零

做题链接:力扣的1089题

✔解题思路:

在这里插入图片描述
在这里插入图片描述

✔具体代码如下:

public static void duplicateZeros(int[] arr) {
        //首先找到最后一个需要复写的位置
        int cur = 0;//当前访问的位置
        int dest = -1;//复写后的长度
        int n = arr.length;
        while (cur < n) {
            if (arr[cur] == 0) dest += 2;
            else dest++;
            //先别急着移动cur,判断一下dest的位置关系
            if (dest >= n - 1) break;
            cur++;
        }
        //处理一下边界i情况
        if (dest == n) {
            arr[n - 1] = 0;
            cur--;
            dest -= 2;
        }
        //从后往前复写
        while (cur >= 0) {
            if (arr[cur] == 0) {
                arr[dest--] = 0;
                arr[dest--] = 0;
                cur--;
            } else {
                arr[dest--] = arr[cur--];
            }
        }
    }

✔总结:

这题自己写的时候有点复杂,但是当知道用快慢指针的时候,瞬间恍然大悟,感叹数学和代码结合的每秒!!!

3. 力扣的11题–盛最多水的容器

做题链接:力扣的11题

✔ 解题思路:

✔具体代码如下:

//解法一:暴力枚举--超时
//解法二:根据单调性,利用双指针--最优解
    public static  int maxArea1(int[] height) {
        //两个指针:左指针,右指针
        int left = 0;
        int right = height.length-1;
        int vMax = 0;//最大体积
        int lon = 0;//最短高度
        while (left < right) {
            //比较左右指针 指向的数组高度 哪一个最短,取最短的
            if(height[right] >= height[left]){
                lon = height[left];
            }else lon = height[right];
            //先计算一次体积,移动一个指针,比较最大体积
            int v = (right - left)*lon;
            //移动最短的指针
            if(height[right] >= height[left]){
                left++;
            }else right--;
            //比较最大体积
            if(v > vMax) vMax = v;
        }
        return vMax;
    }
    //代码优化
    public static  int maxArea(int[] height) {
        //两个指针:左指针,右指针
        int left = 0;
        int right = height.length-1;
        int vMax = 0;//最大体积
        while (left < right) {
            //比较左右指针指向的数组高度 哪一个最短,取最短的--用数学函数
            //先计算一次体积,比较最大体积
            int v = (right - left)*Math.min(height[right],height[left]);
            vMax = Math.max(v,vMax);
            //移动一个指针,移动最短的指针。
            if(height[right] >= height[left]){
                left++;
            }else right--;
        }
        return vMax;
    }

✔总结:

这中题型第一次见,刚做的时候被吓住了,想着该怎么解,感觉高度最大,宽度最大,肯定就是最大体积,但是宽度和高度是没有办法取最大值的,总会有一个是小一点的,那如何求最大的体积?可以说是毫无思路,看见解题思路,发现方法很巧妙!

4. 力扣611题-- 有效三角形的个数

做题链接:力扣611题

✔解题思路:

  1. 先排序,利用单调性,固定最大的数字
  2. 再从右边快速找出三元组
    在这里插入图片描述

✔具体代码如下:

    public int triangleNumber(int[] nums) {
                int len = nums.length;
        int left = 0;
        int c = len-1;
        int right = c-1;
        int count = 0;
        //先对nums进行排序
        Arrays.sort(nums);
        //当c<2时,停止循环判断
        while (c>=2){
            //当left>=right时,停止循环判断
            while (left < right) {
                int sum = nums[left]+nums[right];
                //当a+b>c时,说明a到b之间的数字和b相加都大于c
                //直接相减计算总数即可。
                //当a+b<=c时,就要移动left,判断有没有a+b>c的,但是left必须<right
                if(sum > nums[c]){
                    count += right-left;
                    right--;
                }else if(sum <= nums[c]){
                    left++;
                }
            }
            //当c的所有情况考虑完之后,就要向前移动c,继续判断。
            // 但是c不能<2,因为要保持包括c前面至少有三个数字。
            c--;
            right = c-1;
            left = 0;
        }
        return count;
    }

✔总结:

刚开始想到的就是暴力枚举,用三个for循环,但是工作量太大O(n3),时间太长。上述的解法很巧妙O(n2)!!!充分利用了单调性的特征。

5.力扣15题–三数之和

做题链接:力扣15题

✔解题思路:

在这里插入图片描述

✔具体代码如下:

    public static List<List<Integer>> threeSum(int[] nums) {
        //1. 排序
        Arrays.sort(nums);
        //创建一个二位数组
        List<List<Integer>> lists = new ArrayList<>();
        int n = nums.length;
        //2. 利用双指针算法
        for (int i = 0; i < n; ) {//相当于a
            if (nums[i] > 0) break;
            int left = i + 1, right = n - 1, tar = -nums[i];
            while (left < right) {
                int sum = nums[left] + nums[right];
                if (tar > sum) left++;
                else if (tar < sum) right--;
                else {
                    lists.add(new ArrayList<Integer>(Arrays.asList(nums[i], nums[left], nums[right])));
                    right--;
                    left++;
                    //3. 去重
                    // 将移动后数字与移动前数字进行比较
                    while (left < right && nums[left] == nums[left - 1]) left++;
                    while (right < n - 1 && left < right && nums[right] == nums[right + 1]) right--;
                }
            }
            i++;
            //4. 去重
            while (i < n && nums[i] == nums[i - 1]) i++;
        }
        return lists;
    }

✔总结:

这个题目很考验思维能力和代码能力。我们需要考虑到对数组去重+数组不漏+考虑越界问题。

6. 力扣18题–四数之和

做题链接:力扣18题

✔解题思路:

在这里插入图片描述

✔具体代码如下:

    public static List<List<Integer>> fourSum(int[] nums, int target) {
        List<List<Integer>> lists = new ArrayList<>();
        Arrays.sort(nums);
        if (nums[0] > 0 && target < 0 || nums[nums.length - 1] < 0 && target > 0) return lists;
        for (int i = 0; i < nums.length; ) {
            for (int j = i + 1; j < nums.length; ) {
                int c = j + 1, d = nums.length - 1;
                long  t = (long)target - nums[i] - nums[j];
                System.out.println(t);
                //对c,d区间进行查找,去重
                while (c < d) {
                    if (nums[c] + nums[d] < t) c++;
                    else if (nums[c] + nums[d] > t) d--;
                    else {
                        lists.add(Arrays.asList(nums[i], nums[j], nums[c], nums[d]));
                        c++;
                        d--;
                        while (c < d && nums[c] == nums[c - 1]) c++;
                        while (c < d && nums[d] == nums[d + 1]) d--;
                    }
                }
                //对[j]进行去重
                j++;
                while (j < nums.length && nums[j] == nums[j - 1]) j++;
            }
            //对[i]进行去重
            i++;
            while (i < nums.length && nums[i] == nums[i - 1]) i++;
        }
        return lists;
    }

✔总结:

long t = (long) target - nums[i] - nums[j];这里有个细节问题–我知道加减法的时候可能会越界,要用long型,但是我忘记后面也要强制转型了。我没有注意,导致我总是不知道我错哪里了,哭死我了!!!


感谢家人的阅读,不准确的地方 欢迎在评论区指正!

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

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

相关文章

基于讯飞星火大语言模型开发的智能插件:小策问答

星火大语言模型是一种基于深度学习的自然语言处理技术&#xff0c;它能够理解和生成人类语言。这种模型的训练过程涉及到大量的数据和复杂的算法&#xff0c;但最终的目标是让机器能够像人一样理解和使用语言。 小策问答是一款基于星火大语言模型的定制化GPT插件小工具。它的主…

电脑硬盘数据恢复哪个好?值得考虑的 8 个硬盘恢复软件解决方案

借助硬盘恢复软件&#xff0c;任何人都可以在家中恢复丢失的文件&#xff0c;而无需任何特殊技能。事实上&#xff0c;最困难的一步是选择最佳解决方案&#xff0c;因为可用选项的数量可能有点多。幸运的是&#xff0c;这篇文章可以为您提供帮助。 8 款顶级硬盘数据恢复软件解决…

Spring Cloud和Kubernetes + Spring Boot 用哪个?

Spring Cloud和Kubernetes Spring Boot都是用于构建微服务架构的解决方案&#xff0c;它们各有优势和不足&#xff0c;选择哪个更好取决于你的具体需求和上下文。 Spring Cloud是一个基于Spring Boot的微服务开发框架&#xff0c;它提供了一套完整的微服务解决方案&#xff0…

【Java】I/O流—缓冲流的基础入门和文件拷贝的实战应用

&#x1f33a;个人主页&#xff1a;Dawn黎明开始 &#x1f380;系列专栏&#xff1a;Java ⭐每日一句&#xff1a;你能坚持到什么程度&#xff0c;决定你能达到什么高度 &#x1f4e2;欢迎大家关注&#x1f50d;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 文章目录 一.&…

2023.11.7 Spring 依赖注入的三大方式

目录 前言 属性注入&#xff08;Autowired&#xff09; Setter 注入 构造方法注入 Resource Autowired 和 Resource 的区别 Autowired 和 Resource 查找 Bean 对象的区别 前言 配置文件 ​ <?xml version"1.0" encoding"UTF-8"?> <beans …

kafka微服务学习

消息中间件对比&#xff1a; 1、吞吐、可靠性、性能 Kafka安装 Kafka对于zookeeper是强依赖&#xff0c;保存kafka相关的节点数据&#xff0c;所以安装Kafka之前必须先安装zookeeper Docker安装zookeeper 下载镜像&#xff1a; docker pull zookeeper:3.4.14创建容器 do…

【Redis缓存架构实战常见问题剖析】

文章目录 一、Redis缓存架构实战剖析1.1、大规模的商品缓存数据冷热分离机制1.2、缓存击穿导致线上数据压力暴增解决方案1.3、缓存穿透及其解决方案剖析1.4、突发性的热点缓存数重建导致系统压力暴增问题分析1.5、Redis分布式锁解决缓存与数据库双写不一致问题剖析1.6、利用多级…

Python机器学习算法入门教程(第四部分)

接着Python机器学习算法入门教程&#xff08;第三部分&#xff09;&#xff0c;继续展开描述。 十九、信息熵是什么 通过前两节的学习&#xff0c;我们对于决策树算法有了大体的认识&#xff0c;本节我们将从数学角度解析如何选择合适的“特征做为判别条件”&#xff0c;这里…

微服务 Spring Cloud 5,一图说透Spring Cloud微服务架构

目录 一、域名系统DNS二、LVS&#xff08;Linux Virtual Server&#xff09;,Linux虚拟服务器三、CDN静态资源四、Nginx反向代理服务器1、Nginx的主要作用体现在以下几个方面&#xff1a;2、Nginx静态资源服务和CDN静态资源服务&#xff0c;如何选择&#xff1f; 五、Gateway网…

C#上位机序列10: Winform上位机通用框架

C#上位机序列1: 多线程&#xff08;线程同步&#xff0c;事件触发&#xff0c;信号量&#xff0c;互斥锁&#xff0c;共享内存&#xff0c;消息队列&#xff09; C#上位机序列2: 同步异步(async、await) C#上位机序列3: 流程控制&#xff08;串行&#xff0c;并行&#xff0c…

Panorama SCADA平台的警报通知功能配置详解

1. 前言 SCADA系统的主要目标是采集与监控工业过程数据&#xff0c;以确保工业生产正常运行。通过实时警报通知功能&#xff0c;操作人员可以立即获取有关潜在问题的信息&#xff0c;从而能够快速采取行动解决问题&#xff0c;防止进一步的损害或生产中断。因此&#xff0c;及…

三相电机的某些实测特性曲线

三相电机参数&#xff1a; 0.75KW&#xff0c;额定电流是2A&#xff0c;功率因数0.71&#xff0c;效率78.9%。制式S1. 1.负载不变时的线电压与线电流的关系 1.1相关数据与python代码&#xff1a; 这里记录了一系列的实验&#xff1a; 第一组实验&#xff1a;近乎空载&#xf…

企业微信开启接收消息+验证URL有效性

企业微信开启接收消息验证URL有效性 &#x1f4d4; 千寻简笔记介绍 千寻简笔记已开源&#xff0c;Gitee与GitHub搜索chihiro-notes&#xff0c;包含笔记源文件.md&#xff0c;以及PDF版本方便阅读&#xff0c;且是用了精美主题&#xff0c;阅读体验更佳&#xff0c;如果文章对…

[Framework] Android Handler 工作原理

作者&#xff1a;Tans5 Android 中的 Handler 都被人说烂了&#xff0c;但是还是想多说一次&#xff0c;因为在 Android 的系统中它真的非常重要而且它的机制并没有很复杂&#xff0c;无论是新手和老手都可以好好学习下&#xff0c;这对理解 Android 系统很重要&#xff0c;所以…

如何进行网站测试

随着市场和技术的快速发展&#xff0c;产品需要不断更新和改进以保持竞争力&#xff0c;如果产品停滞不前&#xff0c;很可能会被市场淘汰。通过持续发展&#xff0c;企业可以不断优化产品&#xff0c;提高用户体验&#xff0c;从而赢得市场份额和客户忠诚度。而数通在激烈的市…

计算机毕业设计项目选题推荐(免费领源码)Java+springboot+Mysql停车微信小程序小程序92714

摘 要 在信息飞速发展的今天&#xff0c;网络已成为人们重要的信息交流平台。每天都有大量的农产品需要通过网络发布&#xff0c;为此&#xff0c;本人开发了一个基于springboot停车微信小程序小程序。 对于本停车微信小程序的设计来说&#xff0c;它主要是采用后台采用java语…

Vue+OpenLayers 创建地图并显示鼠标所在经纬度

1、效果 2、创建地图 本文用的是高德地图 页面 <div class"map" id"map"></div><div id"mouse-position" class"position_coordinate"></div>初始化地图 var gaodeLayer new TileLayer({title: "高德地…

PDF有限制密码,不能复制怎么办?

大家现在接触PDF文件越来越多&#xff0c;有的时候在网上下载的PDF文件打开之后&#xff0c;发现选中文字之后无法复制。甚至其他功能也都无法使用&#xff0c;这是怎么回事&#xff1f;该怎么办&#xff1f; 当我们发现文件打开之后&#xff0c;编辑功能无法使用&#xff0c;很…

数据库数据迁移常见方式

数据库数据迁移常见方式 数据库数据迁移常见方式1、通过sql2、通过数据迁移工具3、云服务进行数据迁移什么是DRS服务如何使用DRS服务DRS云服务可以干什么 数据库数据迁移常见方式 1、通过sql 批量导入sql insert into tableName select * 2、通过数据迁移工具 在数据库里面…

19.9 Boost Asio 同步字典传输

这里所代指的字典是Python中的样子&#xff0c;本节内容我们将通过使用Boost中自带的Tokenizer分词器实现对特定字符串的切割功能&#xff0c;使用Boost Tokenizer&#xff0c;可以通过构建一个分隔符或正则表达式的实例来初始化tokenizer。然后&#xff0c;可以使用该实例对输…
最新文章