day1 |704.二分查找、27.移除元素
题目描述:
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class Solution { public int search( int [] nums, int target) { int low= 0 , high=nums.length- 1 ; while (low<=high){ int mid = (low+high)/ 2 ;<br> //用这个写法可能会造成浮点数溢出,详见:<a href="https://blog.csdn.net/jivvv/article/details/128467179?spm=1001.2014.3001.5501" rel="noopener nofollow">代码随想录算法训练营第一天 | 704. 二分查找、27. 移除元素_方可申别翘二郎腿的博客-CSDN博客</a> if (target>nums[mid]){ low=mid+ 1 ; } if (target<nums[mid]){ high=mid- 1 ; } if (target==nums[mid]){ return mid; } } return - 1 ; } } |
刚开始while条件中写的条件是 low!=high 这样会造成错误:nums数组中只有一个元素时会查找错误。
题目描述:
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
代码:
方法一:暴力求解法
时间复杂度:O(n^2)
1 class Solution { 2 public int removeElement(int[] nums, int val) { 3 int len=nums.length; 4 for(int i=0;i<len;i++){ 5 if(nums[i]==val){ 6 for(int j=i+1;j<len;j++){ 7 nums[j-1]=nums[j]; 8 } 9 i--; 10 len--; 11 } 12 } 13 return len; 14 } 15 }
方法二:双指针(定义快慢指针)
时间复杂度:O(n)
快指针:查找旧数组中等于val的元素。
慢指针:更新新数组中的元素。
代码思路:数组中不等于val的值也是新数组中的元素,所以慢指针所指的元素就等于快指针所指的元素,如果快指针遇到val值,则不更新新数组,快指针继续往下走。
1 class Solution { 2 public int removeElement(int[] nums, int val) { 3 int slow=0; 4 for(int i=0;i<nums.length;i++){ 5 if(nums[i]!=val){ 6 nums[slow]=nums[i]; 7 slow++; 8 } 9 } 10 return slow; 11 } 12 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?