704.二分查找
二分法的条件:
- 数组有序
- 数组元素不重复
满足条件才能使用二分法查找。
大致思路是先用数组中值去和目标值对比,如果比目标值小,说明目标值肯定是在数组中值靠右的区间;反之同理。
需要注意的关键点是区间问题,常用左闭右闭和左闭右开
借用代码随想录的图如下:
- 左闭右闭
- 左闭右开
Go 语言实现如下: - 左闭右闭
左闭右闭的情况下,要考虑 low 和 high 的区别func search(nums []int, target int) int { low := 0 high := len(nums) -1 for low <= high{ mid := low + (high - low)/2 if nums[mid] == target { return mid }else if nums[mid] < target { low = mid + 1 }else{ high = mid - 1 } } return -1 }
27. 移除元素
题目:给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
解答:
用双指针,在一个 for 循环中,快指针去找新数组的元素,慢指针更新 新数组
Go 语言实现:
遍历 nums,如果不等于 val,则慢指针 res 在原数组上更新值,最后 nums 数组就变成 nums[:res]
func removeElement(nums []int, val int) int {
res:=0
for _, v := range nums{
if v != val{
nums[res] = v
res++
}
}
nums = nums[:res]//可删
return res
}