代码随想录算法训练营第一天【数组】704.二分查找、27.移除元素
704.二分查找
力扣题目链接:https://leetcode.cn/problems/binary-search/
核心:
使用二分法
前提:
1)数组为有序数组
2)数组中无重复元素。
二分法区间的定义:
左闭右闭、左闭右开
心得:
1)边界条件容易混乱
2)第二次做这道题目了,还是做错了,理解不够深刻!!!
要点总结:
左边界left、右边界right、数组长度length、中间下标middle
区间 | 左边界初始值 | 右边界初始值 | while条件 | 移动左边界 | 移动右边界 |
左闭右闭 | 0 | length | left<=rigth | left=middle+1 | right=middle-1 |
左闭右开 | 0 | length-1 | left<right | left=middle+1 | right=middle |
左闭右闭:
class Solution { public int search(int[] nums, int target) { int len = nums.length; int l = 0; int r = len-1; while(l <= r){ int m = l+(r-l)/2; if(target == nums[m]){ return m; } else if(nums[m] < target){ l = m+1; } else if(nums[m] > target){ r = m-1; } System.out.println("l="+l); System.out.println("r="+r); System.out.println("r="+m); } return -1; } }
左闭右开:
class Solution { public int search(int[] nums, int target) { int len = nums.length; int l = 0; int r = len; while(l < r){ int m = l+(r-l)/2; if(target == nums[m]){ return m; } else if(nums[m] < target){ l = m+1; } else if(nums[m] > target){ r = m; } System.out.println("l="+l); System.out.println("r="+r); System.out.println("r="+m); } return -1; } }
27.移除元素
力扣题目链接:https://leetcode.cn/problems/remove-element/
核心:
双指针
心得:
1)双指针做出来了
class Solution { public int removeElement(int[] nums, int val) { int len = 0; for(int i=0;i<nums.length;i++){ if(nums[i] != val){ nums[len] = nums[i]; len++; } } return len; } }
2)暴力解法反而有问题,下标 i 忘记了向前移动
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?