[豪の算法奇妙冒险] 代码随想录算法训练营第一天 | 704-二分查找、27-移除元素、977-有序数组的平方

news/2025/11/19 20:31:33/文章来源:https://www.cnblogs.com/SchwarzShu/p/19243940

代码随想录算法训练营第一天 | 704-二分查找、27-移除元素、977-有序数组的平方


LeetCode704 二分查找

题目链接:https://leetcode.cn/problems/binary-search/submissions/679153988/

卡哥文章讲解:https://programmercarl.com/0704.二分查找.html

卡哥视频讲解:https://www.bilibili.com/video/BV1fA4y1o715

第一遍 自己独立完成

​ 一上来先自己做一遍,初看题目,分了三种情况画图:nums[mid] < target、nums[mid] > target、nums[mid] = target,再在外面套个while循环,自信满满点了提交hh,然后报错:

image-20251119113025980

​ 看了错误详情,恍然大悟,发现我的while循环条件有误:

image-20251119113443432

​ 如果循环判断条件只是left<right的话,遇到‘’nums={5},target=5‘’的情况就不会进入循环,mid都求不到就返回-1了,这显然不对

​ 把这个条件改成left<=right,再遇到上述情况,就能够成功进入循环,改变result,返回正确结果了:

image-20251119115012323

class Solution {public int search(int[] nums, int target) {int left = 0;int right = nums.length - 1;int result = -1;while(left <= right){int mid = (left + right)/2;if(nums[mid] > target){right = mid - 1;}else if(nums[mid] < target){left = mid + 1;}else{result = mid;break;}}return result;}
}

第二遍 看讲解、深入刨析、做小结

​ 二分法,把握好区间边界问题,分清楚题目区间到底是左闭右闭还是左闭右开

左闭右闭[left, right]

  • 初始赋值 left = 0,right = nums.length - 1
  • [1,1]是合法区间,所以while(left <= right)
  • 当nums[mid] != target时,mid对应下标应排除出搜索区间,相应left = mid+1,right = mid-1

左闭右开[left, right)

  • 初始赋值 left = 0,right = nums.length
  • [1,1)是非法区间,所以while(left < right)
  • 当nums[mid] != target时,mid对应下标应排除出搜索区间,相应left = mid+1,right = mid

LeetCode27 移除元素

题目链接:https://leetcode.cn/problems/remove-element/

文章讲解:https://programmercarl.com/0027.%E7%A7%BB%E9%99%A4%E5%85%83%E7%B4%A0.html

视频讲解:https://www.bilibili.com/video/BV12A4y1Z7LP

第一遍 自己独立完成

​ 初看题目,思路还算比较清晰:首先先建立一个nums2数组用于存放nums数组中不等于val的元素,再用k来计数。

​ 第一次for循环,得到nums2数组和k的值

​ 第二次for循环,再将nums2数组覆盖到nums数组上,这样nums数组前k个元素就能符合题目要求

image-20251119171357407

class Solution {public int removeElement(int[] nums, int val) {int k = 0;int length = nums.length;int[] nums2 = new int[length];for(int i = 0;i < length;i++){if(nums[i] != val){nums2[k] = nums[i];k++;}}for(int i = 0;i < k;i++){nums[i] = nums2[i];}return k;}
}

第二遍 看讲解、深入刨析、做小结

​ 看了讲解之后,发现还能使用双指针的思路解这道题目

​ 快指针用来获取新数组中的元素,慢指针用来获取新数组中需要更新的位置

​ 因为slow从0开始,所以它最后指向的下标,就是新数组中元素的个数

image-20251119174015453

class Solution {public int removeElement(int[] nums, int val) {int slow = 0;int fast = 0;for(;fast < nums.length;fast++){if(nums[fast] != val){nums[slow] = nums[fast];slow++;}}return slow;}
}

LeetCode977 有序数组的平方

题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/

文章讲解:https://programmercarl.com/0977.%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E7%9A%84%E5%B9%B3%E6%96%B9.html

视频讲解: https://www.bilibili.com/video/BV1QB4y1D7ep

第一遍 自己独立完成

​ 第一眼看到题目,首先想到的思路是先用一次for循环把nums数组所有元素平方,然后再用排序算法升序排序

​ 这里挑了比较好实现的冒泡排序,虽然题目AC,但很显然,这代码并不优雅,还有很多可改进的空间

image-20251119200454993

class Solution {public int[] sortedSquares(int[] nums) {int length = nums.length;for(int i = 0;i < length;i++){nums[i] = nums[i]*nums[i];}for(int i = 0;i < length;i++){for(int j = 0;j < length-i-1;j++){if(nums[j] > nums[j+1]){int temp = nums[j];nums[j] = nums[j+1];nums[j+1] = temp;}}}return nums;}
}

第二遍 看讲解、深入刨析、做小结

​ 看了讲解以后,发现这题还能用双指针的思路求解,时间复杂度来到O(n)

​ 一左一右两个指针逐渐向中间靠拢,由大到小生成一个新数组

​ 最后用双指针的思路写了一遍,代码十分优雅呀hh:

image-20251119202446700

class Solution {public int[] sortedSquares(int[] nums) {int length = nums.length;for(int i = 0;i < length;i++){nums[i] = nums[i] * nums[i];}int left = 0;int right = length - 1;int[] result = new int[length];int cnt = length - 1;while(left <= right){if(nums[left] <= nums[right]){result[cnt] = nums[right];cnt--;right--;}else{result[cnt] = nums[left];cnt--;left++;}}return result;}
}

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

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

相关文章

完整教程:【C语言实战(44)】C语言打造全能简易计算器:突破运算极限

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

【第7章 I/O编程与异常】 `for line in f`及其需要的文件打开模式

for line in f? 以及文件打开模式 一、为什么 for line in f 可以逐行读取文件? 这是Python文件对象的一个「语法糖」特性,本质是利用了文件对象的可迭代性。 1. 什么是「可迭代对象」? 简单说,就是可以用 for 循…

Google 王炸!Gemini 3 Pro 上线:前端能力、代码理解全面进化。

昨天 Google 发布了新模型Gemini 3 Pro,这个模型可以说是异常强大。 目前已经可以在 Gemini CLI 、Gemini 网页、antigravity 中使用。【gzh:和平本记】 Gemini CLI 如何使用? 使用资格: 1)目前 Gemini 3 Pro 已面…

【Agent】MemOS 源码笔记---(1)--基本概念

【Agent】MemOS 源码笔记---(1)--基本概念 目录【Agent】MemOS 源码笔记---(1)--基本概念0x00 概要0x01 背景1.1 为什么需要MemOS1.2 MemOS 相关信息1.3 MemOS能做些什么0x02 原理2.1 记忆类型2.1.1 GeneralTextMemory…

完整教程:GPTBots 工作流:让AI从“会说“到“会做“的技术演进引言:企业AI化的瓶颈在哪里?

完整教程:GPTBots 工作流:让AI从“会说“到“会做“的技术演进引言:企业AI化的瓶颈在哪里?2025-11-19 20:20 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !impo…

html-webpack-plugin扩展创建:自定义钩子构建

html-webpack-plugin扩展创建:自定义钩子构建pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &q…

Android中EditText同时支持textMultiLine与imeOptions(action/actionSend/...)

Android中EditText同时支持textMultiLine与imeOptions(action/actionSend/...) 在Android中,如果想要imeOptions起作用,则要求android:singleLine="true"或者android:inputType="text",此时不能…

Day43(13)-基本上都是在敲SQL-db04

多表查询 笛卡尔积-- 查询 select * from emp ,dept where emp.dept_id = dept.id;-- 查询 select * from emp ,dept where emp.dept_id = dept.id;-- ============================= 内连接 ========================…

空间变换层和自注意力机制

空间变换层和自注意力机制Spatial Transformer Layer(空间变换层)是一种在卷积神经网络中引入空间变换的机制。它允许网络自动学习输入图像的几何变换,以提高网络的鲁棒性和性能。它可以通过学习如何对输入进行旋转…

linux ftp 客户端安装

在 Linux 系统中,ftp 是一个传统的 FTP 客户端工具,但随着现代 Linux 发行版的更新,ftp 已被 ftp 工具(如 vsftpd)所替代,或者更常见的是使用 curl、wget、lftp 等现代工具来实现 FTP 功能。 一、使用 ftp 工具(…

MacX Video Converter Pro for Mac v6.8.2 安装视频转换器安装步骤(附安装包)

MacX Video Converter Pro for Mac v6.8.2 安装视频转换器安装步骤(附安装包)​ MacX Video Converter Pro是一款专为 Mac 电脑用户设计的 专业视频格式转换软件,支持 快速转换各种视频格式,比如 MP4、AVI、MOV、M…

数字分身---沃伦巴菲特

# 沃伦巴菲特 数字化身 ━━━━━━━━━━━━━━━━ **输入接口**:任意提问 **输出模式**:以巴菲特视角作答 ━━━━━━━━━━━━━━━━ ## 身份定位 你是沃伦巴菲特。 价值投资教父本杰明格雷厄姆的嫡…

SPYSE团队独家专访:构建互联网基础设施搜索引擎的技术实践

本文深入访谈SPYSE团队,探讨其CertDB SSL证书搜索引擎的技术架构、数据采集方式和产品定位。团队详细介绍了全网扫描技术、API设计理念、与Censys等竞品的对比分析,以及未来在DNS和域名分析领域的技术规划。独家专访…

数学的大厦(四):减法与整数

为了解决旧领域内“不自然”或“不可能”的问题,我们必须构想并构建一个更广阔的新领域。自然数宇宙的边界,正是被“减法”这道鸿沟给清晰地勾勒了出来。 在我们的自然数世界里,加法 a + b 和乘法 a * b 是畅通无阻…

深入解析:Kotlin 高阶函数在回调设计中的最佳实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

医药生产线HMI与PLC互联:总线协议Modbus RTU 转Modbus TCP 适配方案

一、项目背景:无菌注射剂灌装生产线的通讯困境 在工业自动化领域的医药无菌注射剂灌装生产线中,某企业采用施耐德 HMI(Modbus RTU 协议)负责灌装参数设定(如剂量 5ml0.02ml)、设备操作监控,搭配西门子 S7-1500 …

信息化、数字化、智能化、智慧化、数智化,到底啥区别 - 智慧园区

这几年啊,很多人开口闭口就是“我们要搞数智化转型”“我们系统已经智能化了”“这个流程已经数字化改造过了” ……听着都挺高大上,但你真要追问一句:“信息化、数字化、智能化、智慧化、数智化,咱们到底搞的是哪…

洛谷 B4413:[GESP202509 三级] 数组清零

​【题目来源】https://www.luogu.com.cn/problem/B4413【题目描述】小 A 有一个由 n 个非负整数构成的数组 a=[a1, a2, …, an]。他会对阵组 a 重复进行以下操作,直到数组 a 只包含 0。在一次操作中,小 A 会依次完成…

MOSHELL (7) : 构建3G RNC端到端性能可观测性体系 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

中大型超市智能运营导购系统:AI 精准推送,滞销品库存加速 19%!

想象一下:周六下午的超市人潮汹涌,新客推着购物车一脸茫然,老客直奔货架却找不到心仪商品,导购被围得喘不过气,促销海报无人问津——这不是个例,而是中大型超市每天上演的“失控剧本”。中大型超市每天面对的痛点…