Leetcode81. 搜索选择排序数组II(重复元素)
1. 问题描述
2. 思路
- 去重
- 二分查找
3. 代码
3.1 双指针去重
func search(nums []int, target int) bool {
// 双指针去重
slow, fast := 0, 0
for fast < len(nums) {
for fast < len(nums) - 1 && nums[fast] == nums[fast+1] {
fast++
}
nums[slow] = nums[fast]
slow++
fast++
}
// fmt.Println(slow)
left, right := 0, slow - 1
for left <= right {
mid := left + (right - left) / 2
if nums[mid] == target {
return true
}
if nums[mid] >= nums[0] { // mid落在断点左侧
if target >= nums[0] && target < nums[mid] { // target在[0,mid-1]范围内
right = mid - 1
} else {
left = mid + 1
}
} else { // mid落在断点右侧
if target <= nums[slow-1] && target > nums[mid] { // target在[mid+1,len(nums)-1]范围内
left = mid + 1
} else {
right = mid - 1
}
}
}
return false
}
3.2 新开切片去重
func search(nums []int, target int) bool {
// 新开切片去重
nums1 := make([]int,0)
for i := 0; i < len(nums); i++ {
for i < len(nums) - 1 && nums[i] == nums[i+1] {
i++
}
nums1 = append(nums1,nums[i])
}
left, right := 0, len(nums1) - 1
for left <= right {
mid := left + (right - left) / 2
if nums1[mid] == target {
return true
}
if nums1[mid] >= nums1[0] { // mid落在断点左侧
if target >= nums1[0] && target < nums1[mid] { // target在[0,mid-1]范围内
right = mid - 1
} else {
left = mid + 1
}
} else { // mid落在断点右侧
if target <= nums1[len(nums1) - 1] && target > nums1[mid] { // target在[mid+1,len(nums)-1]范围内
left = mid + 1
} else {
right = mid - 1
}
}
}
return false
}