day4 查找算法|剑指 Offer 03. 数组中重复的数字|剑指 Offer 53 - I. 在排序数组中查找数字 I|剑指 Offer 53 - II. 0~n-1中缺失的数字

剑指 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)
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值