算法之路(一)

news2024/11/24 12:37:29

🖊作者 : 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.coloradmin.cn/o/1185699.html

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

相关文章

接口--抽象方法

回答问题&#xff1a; 1.接口是什么&#xff1f; 2.接口中可以包含什么内容&#xff1f; 3.如何定义接口格式&#xff1f; 4.接口定义抽象方法格式&#xff1f; Code //接口是公共规范标准&#xff0c;类似于“模具” //如何定义接口格式&#xff1f;/** public interface 接…

【Qt之QVariant】使用

介绍 QVariant类类似于最常见的Qt数据类型的联合。由于C禁止联合类型包括具有非默认构造函数或析构函数的类型&#xff0c;大多数有趣的Qt类不能在联合中使用。如果没有QVariant&#xff0c;则QObject::property()和数据库操作等将会受到影响。 QVariant对象同时持有一个单一…

View 自定义 - 路径 Path

参考文章 一、概念 用于描述顺序 & 区域&#xff0c;单使用无法产生效果。 图形绘制的本质是先画点再将点连接起来&#xff0c;所以点与点之间是存在一个先后顺序的。图形的方向影响的是&#xff1a;添加图形时确定闭合顺序(各个点的记录顺序)、图形的渲染结果(是判断图形…

ArcGIS进阶:水源涵养功能分级评价操作

首先抛出水源涵养重要性评价的公式&#xff1a;水源涵养量降雨量-蒸散发量-地表径流量&#xff0c;其中地表径流量降雨量*平均地表径流系数 声明&#xff1a;以下数据来源于来自于牛强老师书籍&#xff08;城乡规划GIS技术&#xff09;。 以下给出重要性评价阈值表&#xff1…

『MySQL快速上手』-⑥-表的约束

文章目录 1.空属性2.默认值3.列描述4.zerofill5.主键6.自增长7.唯一键8.外键9.综合案例 真正约束字段的是数据类型&#xff0c;但是数据类型约束很单一&#xff0c;需要有一些额外的约束&#xff0c;更好的保证数据的合法性&#xff0c;从业务逻辑角度保证数据的正确性。 1.空…

高校为什么需要企业数据库?

随着信息化数字化的发展&#xff0c;企业数据库已经成为高校不可或缺的一部分。企业数据库一般整合了多维度企业数据信息。比如&#xff0c;艾思依托丰富的数据沉淀和领先的模型算法&#xff0c;打造“1N”产业大数据平台&#xff0c;包含“1个企业数据中心”一一涵盖全国2.4亿…

计算机提示找不到concrt140.dll怎么办,分享4个有效的修复方法

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示或者系统崩溃的情况。其中&#xff0c;concrt140.dll是一个常见的错误提示&#xff0c;这个错误通常会导致某些应用程序无法正常运行。为了解决这个问题&#xff0c;我们需要采取一些修复措施。本文将介绍4个修复conc…

基于显著性的无人机多光谱图像语义杂草检测与分类

Saliency-Based Semantic Weeds Detection and Classification Using UAV Multispectral Imaging(2023&#xff09; 摘要1、介绍2、相关工作2.1 监督学习2.2 半监督学习2.3 无监督学习 3、方法3.1 贡献3.2 PC/BC-DIM NEURAL NETWORK&#xff08;预测编码/有偏竞争-分裂输入调制…

20个Python实用小技巧!来自十年老程序员的推荐~

文章目录 1.用itertools排列2.单行条件表达式3. 反转字符串4. 使用 Assert 处理异常5. 对多个输入使用拆分6. 用 zip() 转置矩阵7. 资源上下文管理器8. 下划线作为分隔符9. 尝试 f 字符串格式10.用这个技巧交换整数11. 使用 lambda 代替函数12.多次打印无循环13. 将字符串解包为…

基于机器学习的 ICU 脑血管疾病死亡风险智能预测系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 Wechat / QQ 名片 :) 1. 项目简介 重症患者或重大手术后的患者在重症监护室&#xff08;ICU&#xff09;内通过多种生命支持系统以维持生理功能。患者在ICU 内会被频繁持续的记录生命体征和实验室测量等多种数据。由于高频…

电大搜题——搜索难题

添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 广东开放大学是一所素有口碑的知名学府&#xff0c;一直致力于为广大学员提供优质的教育资源和学习支持。随着科技的不断发展&#xff0c;电子学习成为了现代学习的主要方式之一。为了更好地满足学员的学习…

Django(一、简介,安装与使用)

文章目录 一、Django引入1.web应用程序什么是web&#xff1f;web引用程序的优点web应用程序的缺点什么是web框架 2.纯手写web框架1.web框架的本质2.HTTP协议的特性&#xff1a;3.编写基于wsgire模块搭建web框架代码封装优化代码封装 二、Django框架的学习1.Python中的主流框架2…

Kubernetes实战(四)-部署docker harbor私有仓库

1 Docker原生私有仓库Registry 1.1 原生私有仓库Registry概述 Docker的仓库主要分两类&#xff1a; 私有仓库公有仓库 共有仓库只要在官方注册用户&#xff0c;登录即可使用。但对于仓库的使用&#xff0c;企业还是会有自己的专属镜像&#xff0c;所以私有库的搭建也是很有…

基于SSM的婚恋网站的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

前端常用的开发工具有哪些?

目录 内置管理系统的通用场景 前后端代码生成器 权限管控 开放源码 运行性能 主流数据库 写在最后 目前使用的是JNPF框架。 前端采用Vue.js&#xff0c;这是一种流行的前端JavaScript框架&#xff0c;用于构建用户界面。Vue.js具有轻量级、可扩展性强和生态系统丰富等特点&…

成集云 | 企业微信考试+活动抽奖小程序系统 | 解决方案

方案介绍 企业微信考试功能是一种基于企业微信平台的在线考试系统&#xff0c;可以帮助企业进行员工培训、考核、招聘等考试场景。 活动抽奖小程序系统是一种基于互联网技术的应用程序&#xff0c;旨在为用户提供便捷、公平的抽奖体验。它可以帮助商家或平台吸引用户关注和参…

Gorm 中的钩子和回调

一个全面的指南&#xff0c;利用 GORM 中的钩子和回调的力量&#xff0c;为定制的数据库工作流程 在数据库管理领域&#xff0c;定制化是打造高效和定制化工作流程的关键。GORM&#xff0c;这个充满活力的 Go 对象关系映射库&#xff0c;为开发人员提供了钩子和回调的功能&…

机器人伺服驱动控制环

伺服驱动器​的控制环&#xff0c;包括&#xff1a;位置环、速度环、电流环这三种类型。 对于伺服的控制回路&#xff0c;内侧控制环的响应带宽一般会是外侧控制环的5到10倍。也就是说&#xff0c;电流环带宽大致是速度环的5到10倍&#xff0c;速度环带宽则约为位置环的5到10倍…

K8S知识点(七)

&#xff08;1&#xff09;实战入门-Namespace kubernets&#xff1a;系统创建的资源在这个命名空间里 &#xff0c;集群组件资源 kubrnets组件也是以pod的形式运行的 命令行方式操作 查看namespace和详情&#xff1a; 创建和查看和删除&#xff1a; 使用过配置文件操作&am…

Docker 介绍

Docker 介绍 1 介绍1.1 概述1.2 资源高效利用1.3 发展历程1.4 组件1.5 工具1.6 对环境部署和虚拟化的影响1.7 优点1.8 容器技术核心CgroupNamespaceUnionFS 2 命令信息、状态、配置info命令用于显示当前系统信息、docker容器、镜像个数、设置等信息 镜像容器资源 3 安装3.1 版本…