今日题目:704. 二分查找,27. 移除元素
704.二分查找
要点:
1. left <= right
2. index 是否加减1
题目不难,注意以上两点,处理好区间就行。根据区间类型可以划分出两种写法:左闭右闭,左闭右开。要注意判断区间是否合理,比如[1,1]是合理的,但是[1,1)不行。据此可以决定index是否加减1.
左闭右闭:
func search(nums []int, target int) int {
head := 0
tail := len(nums)-1
for head <= tail {
index := (head + tail)/2
if nums[index] == target {
return index
} else if nums[index] < target {
head = index+1
} else if nums[index] > target {
tail = index-1
}
}
return -1
}
左闭右开:
func search(nums []int, target int) int {
head := 0
tail := len(nums)
for head < tail {
index := (head + tail)/2
if nums[index] == target {
return index
} else if nums[index] < target {
head = index+1
} else if nums[index] > target {
tail = index
}
}
return -1
}
27.移除元素
要点:
1. 使用双指针在原数组操作
看到题目的第一反应是直接暴力,遇见需要删除的元素直接将后续的元素全部前移即可。但是要注意对末尾元素的处理。
答案的双指针是更简洁高效的做法,其思路是将不需要删除的元素,即不等于val的元素放置在数组的头部,那么[0, left)就包含了需要保留的元素,left就是删除元素后数组的长度。方案具体如下:
1. 设置left和right两个指针,left表示当前需要赋值的位置,right是向右搜索的指针。
2. 如果当前num不等于val,说明需要保留,将num放在left指针位置,left右移,right继续搜索。
3. 如果num等于val,则不需要保留在[0, left) 的区间中,right继续搜索即可。
4. 循环结束后left即为删除后的数组长度。
代码:
func removeElement(nums []int, val int) int {
left := 0
for _, item := range nums {
if item != val {
nums[left] = item
left++
}
}
return left
}