第一章数组
二分查找
-
使用条件:数组有序;无重复元素
-
区间的定义:
-
左闭右闭[left, right]
while (left <= right) { // 当left==right,区间[left, right]依然有效,所以用 <= int middle = left + ((right - left) / 2);// 防止溢出 等同于(left + right)/2 if (nums[middle] > target) { right = middle - 1; // target 在左区间,所以[left, middle - 1] } else if (nums[middle] < target) { left = middle + 1; // target 在右区间,所以[middle + 1, right] } else { // nums[middle] == target return middle; // 数组中找到目标值,直接返回下标 } }
-
左闭右开[left, right)
while (left < right) { //因为left == right的时候,在[left, right)是无效的空间,所以使用 < int middle = left + ((right - left) >> 1); if (nums[middle] > target) { right = middle; // target 在左区间,在[left, middle)中 } else if (nums[middle] < target) { left = middle + 1; // target 在右区间,在[middle + 1, right)中 } else { // nums[middle] == target return middle; // 数组中找到目标值,直接返回下标 } }
-
704.二分查找
补充题目35,34
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
}
双指针法
通过一个快指针和一个慢指针在一个for循环下完成两个for循环的工作。
27.移除元素
func removeElement(nums []int, val int) int {
slow := 0
lenth := len(nums)
for fast := 0; fast < lenth; fast++ {
if nums[fast] != val {
nums[slow] = nums[fast]
slow++
}
}
return slow
}