leetcode-01-[704]二分查找[27]移除元素

发布时间:2026/8/7 22:47:12
leetcode-01-[704]二分查找[27]移除元素 一、[704]二分查找//二分法有序 //[left,right] 故判定条件为left right,等于此时有意义 //缩小范围 leftmid1 //right nums.length-1; //不要忘了修改mid 的值 class Solution { public int search(int[] nums, int target) { int left0; int right nums.length-1; int mid(rightleft)/2; while(leftright) { if(nums[mid]target){ rightmid-1; } else if (nums[mid]target) { leftmid1; }else{ return mid; } mid(rightleft)/2;//不要忘了修改mid 的值 } return -1; } }一些注意事项1、核心思想排除不符合条件的区间2、区间普通查找左闭右闭区间找边界左闭右开区间3、普通二分查找可以理解为找target的第一个元素left的含义为第一个满足条件的元素right为最后一个不满足条件的元素4、找边界leftmid1;rightmid 或mid-1 主要看此时mid是不是候选值虽然mid在上一轮已经检查过但也可能满足条件特殊的左闭右开区间rightmid因为此时是开区间mid已排除反之若rightmid-1,则排除了mid-1这个元素二、[27]移除元素1、对撞指针改变了元素的相对顺序class Solution { public int removeElement(int[] nums, int val) { int left0,right nums.length-1; while(leftright) { if(nums[left]!valnums[right]val) { left; right--; }else if(nums[left]!valnums[right]!val){ left; } else if (nums[left]valnums[right]val) { right--; } else if (nums[left]valnums[right]!val) { int tmpnums[left]; nums[left]nums[right]; nums[right]tmp; left; right--; } } return left; } }2、对撞指针代码优化class Solution { public int removeElement(int[] nums, int val) { int left 0; int right nums.length - 1; while (left right) { if (nums[left] ! val) { left; } else if (nums[right] val) { right--; } else { nums[left] nums[right]; right--; } } return left; } }3、快慢指针推荐没有改变元素的相对顺序//快指针找到与目标值不相同的值将其传给慢指针 //慢指针接收快指针的值 class Solution { public int removeElement(int[] nums, int val) { // 快慢指针 int slowIndex 0; for (int fastIndex 0; fastIndex nums.length; fastIndex) { if (nums[fastIndex] ! val) { nums[slowIndex] nums[fastIndex]; slowIndex; } } return slowIndex; } }