剑指 Offer 03. 数组中重复的数字
func findRepeatNumber(nums []int) int {
i :=0
for i < len(nums) {
if nums[i] == i {
i++
continue
}
if nums[i] == nums[nums[i]] {
return nums[i]
}
nums[i],nums[nums[i]] = nums[nums[i]], nums[i]
}
return -1
}
剑指 Offer 53 - I. 在排序数组中查找数字 I
// 思路1,二分查找。可以和34一样做法,因为该数组是单调递增的。所以可以通过找第一个和最后一个。r-l+1来找到次数
// 思路2,遍历+计数字
func search(nums []int, target int) int {
l := first(nums, 0, len(nums)-1, target)
r := last(nums, 0, len(nums)-1, target)
return r - l + 1
}
func first(nums []int, l, r, target int) int {
for l < r {
mid := l + (r - l) / 2
if nums[mid] >= target {
r = mid
} else {
l = mid + 1
}
}
if len(nums) != 0 && nums[l] == target {
return l
}
return 2
}
func last(nums []int, l,r,target int) int {
for l < r {
mid := l + (r-l + 1)/2
if nums[mid] <= target {
l = mid
} else {
r = mid - 1
}
}
if len(nums) != 0 && nums[l] == target {
return l
}
return 1
}
剑指 Offer 53 - II. 0~n-1中缺失的数字
/*强调过无数次,二分的本质是「二段性」。
我们可以考虑对于一个给定数组 nums 中,对于缺失元素左右数值而言,有何性质。
假设我们缺失的元素数值为 x,那么对于 x 左边的元素(若有)必然是完整且连续的,也就是其必然满足 nums[i] = i,而其右边的元素(若有)必然由于 x 的缺失,导致必然不满足 nums[i] = i,因此在以缺失元素为分割点的数轴上,具有二段性,我们可以使用「二分」来找该分割点
*/
func missingNumber(nums []int) int {
l,r := 0,len(nums)-1
for l < r {
mid := l+(r-l)/2
if nums[mid]==mid {
l = mid + 1
} else { //nums是有序数组,如果mid和数字不相同就在左边查找
r = mid
}
}
if l != nums[l] {
return l
}
return len(nums)
}