跟着LeetCode的Study Plan重温一遍各种经典算法,本期是二分搜索算法Level1 Day7。
题目构成:Medium*1
+ Easy*1
。
经典的Two Sum
,有其他解法,但这里是有序数组,按要求用二分法解,代码(Golang)如下:
func twoSum(numbers []int, target int) []int {
q := len(numbers) - 1
for i, n := range numbers {
m := target - n
p := i + 1
for p <= q {
o := (p + q) / 2
v := numbers[o]
if v == m {
return []int{i + 1, o + 1}
} else if v > m {
q = o - 1
} else {
p = o + 1
}
}
}
return nil
}
找到一个数X
,使数组中大于等X
的元素个数等于X
,注意X
可以不是数组中的元素,代码(Golang)如下:
func specialArray(nums []int) int {
sort.Ints(nums)
// fmt.Println(nums)
helper := func(target int) int {
i, j := 0, len(nums)-1
for i <= j {
k := (i + j) / 2
// 找到第一个大于等于target的位置
if nums[k] < target {
i = k + 1
} else {
j = k - 1
}
}
return j + 1
}
for i := 0; i <= nums[len(nums)-1]; i++ {
q := helper(i)
// fmt.Println(i, q)
if len(nums)-q == i {
return i
}
}
return -1
}
核心思想是:
1. 先排序数组
2. helper
方法用来查找指定target
插入有序数组时应该插入在哪个位置,和35. Search Insert Position类似
3. 从0
遍历到数组最大值,找到一个i
使得位置q
之后有i
个数字