代码随想录

704 二分查找

定义两个指针, left 和 right, 值取左闭右闭,即 left = 0, right = nums.length - 1

while 循环条件则要遵循上面定义好的边界, 左闭右闭, 所以 left 可以 = right, 则 while (left <= right)

while 循环中要严格按照区间的定义来写, 符合 left right 区间, 就是对的

middle = (left + right) / 2 为了防止溢出, 可以写为 middle = left + ((right - left) / 2)

27 移除元素

我这里用了左指针和右指针, 区间也是闭合的, 所以 while (left <= right), count = nums.length 为新数组初始长度

从 left 开始循环

当 if (nums[left] == val), 将 left 和 right 的值互换, right–, 因为返回的数组只取它移除元素后的长度, 所以要移除的元素必须在数组的后面, count–

else left++

977 有序数组的平方

原始数组是从小到大, 有负数, 平方后会怎么样呢, 两边大中间小

那我们可以定义双指针, 同样是左闭右闭, left = 0, right = nums.length - 1

重新生成一个新数组 int[] result = new int[nums.length]

因为是从小到大排序, 那循环 result 时, 从后向前循环

if (nums[left] * nums[left] > nums[right] * nums[right]), 则 result[i] = nums[left] * nums[left], left++,

else result[i] = nums[right] * nums[right], right–,