LeetCode 704-二分查找
题目链接:力扣
解题思路:
-
数组为升序:二分法
-
注意区间问题,区间:[ ]即包括边界,[ )即不包括右边界
代码实现
//二分法 - 左闭右闭 class Solution { public int search(int[] nums, int target) { if (target < nums[0] || target > nums[nums.length-1]) { return -1; } //先把无法实现返回-1的情况写在最前,最先判断 int left = 0,right = nums.length - 1; while (left <= right) //闭区间,左右区间可能相同 { int mid = left + ((right - left) >> 1); if (nums[mid] == target) { return mid; } else if (nums[mid] > target) { right = mid - 1; } else if (nums[mid] < target) { left = mid + 1; } } return -1; } }
难点:
区间导致边界不同,左闭右闭,若nums[mid] > target 则目标元素在target左边,不包括mid,所以right改为mid - 1
mid的写法:
原以为是mid = (right + left) / 2 、这种情况会发生上溢问题
'>>1'表示二进制右移一位,数被除2不取余
LeetCode27-移除元素
题目链接:力扣
解题思路:
-
用暴力解法遍历,找到目标元素后用for循环将后面元素向前移一位
-
用快慢指针完成两个for需要做的工作
代码实现
//暴力解法 class Solution { public: int removeElement(vector<int>& nums, int val) { int size = nums.size(); for (int i = 0; i < size; i++) { if (nums[i] == val) { // 发现需要移除的元素,就将数组集体向前移动一位 for (int j = i + 1; j < size; j++) { nums[j - 1] = nums[j]; } i--; // 因为下标i以后的数值都向前移动了一位,所以i也向前移动一位 size--; // 此时数组的大小-1 } } return size; } }; //快慢指针 public int removeElement(int[] nums, int val) { int len = nums.length; int slowIndex = 0; for (int fastIndex = 0;fastIndex < len;fastIndex++) { if (nums[fastIndex] != val) { nums[slowIndex++] = nums[fastIndex]; } } return slowIndex; } }
难点
-
fast指针作用:获取新数组所需元素
-
slow指针作用:新数组中需要更新的下标位置
-
核心思想:如果碰到目标元素,则fast向后移一位,slow不动,直到fast移到下一个非目标元素,再赋给slow