vlambda博客
学习文章列表

二分查找法尝尝几道题,还没过瘾|python代码

披星戴月奔向理想和你

你好呀 

我是苏钟白

题目来源|Leetcode官网


1

9


剑指 Offer 53 - II. 0~n-1中缺失的数字


题目:


一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。


示例 1:

输入: [0,1,3]

输出: 2


示例 2:

输入: [0,1,2,3,4,5,6,7,9]

输出: 8


思路:


最容易想到的是0-n遍历,判断i是否在数组里,不在则返回i,跑了1280ms。其次可以想到对于这样的一个递增数组,下标与数是一致的,如果index与数不一样,则说明这个数缺失。另一个方法就是二分查找法。


那什么是二分查找法呢?


(提问:什么是快速排序法?什么是摩尔投票法?)


对于有序数组,找数组的中间数与目标查找数比较,如果找到则结束,如果中间数大于目标数,则在中间数前半部分循环这个过程,如中间数小于目标数则在中间数后半部分循环这个过程,直到找到目标数,否则数组中没有该数。


如何用二分查找解决这题?


我们先设置两个左右指针,一头一尾,然后不断的判断两个指针的中间mid与该中间数索引对应的元素nums[mid]是否相等,相等则说明中间索引左边的所有元素都是有的,缺失的数在右边,所以左边的指针等于mid+1,否则右边的指针等于mid-1。最后返回的左指针就是缺失的值。具体可看下面的代码。


代码:


 二分查找法尝尝几道题,还没过瘾|python代码



2

9


888. 公平的糖果交换


题目:


爱丽丝和鲍勃拥有不同总数量的糖果。有两个数组 aliceSizes  bobSizes aliceSizes[i] 是爱丽丝拥有的第 i 盒糖果中的糖果数量,bobSizes[j] 是鲍勃拥有的第 j 盒糖果中的糖果数量。


两人想要互相交换一盒糖果,这样在交换之后,他们就可以拥有相同总数量的糖果。一个人拥有的糖果总数量是他们每盒糖果数量的总和。


返回一个整数数组 answer,其中 answer[0] 是爱丽丝必须交换的糖果盒中的糖果的数目,answer[1] 是鲍勃必须交换的糖果盒中的糖果的数目。如果存在多个答案,你可以返回其中 任何一个 。题目测试用例保证存在与输入对应的答案。


示例 1

输入:aliceSizes = [1,1], bobSizes = [2,2]输出:[1,2]


示例 2

输入:aliceSizes = [1,2], bobSizes = [2,3]输出:[1,2]


示例 3

输入:aliceSizes = [2], bobSizes = [1,3]输出:[2,3]


示例 4

输入:aliceSizes = [1,2,5], bobSizes = [2,4]输出:[5,4]


思路:


看到题目想到的思路是两层for循环,交换alice的元素和bob中每个元素,如果交换后两个数组和相等则返回结果,否则再把两个数交换回来。但果不其然,超时。


这题主要想到差值gap即用alice数组的和减去bob数组的和再除以2。然后对于alice中的元素,只需在bob中判断有没有该元素-gap


想到三种方法,一种就是直接判断,一种是先排序然后二分查找,一种是双指针。


这里简单说一下二分查找法。


就是对bob排序,对alice中的元素循环,对左右两个指针求中间值mid,如果循环到的元素bob[mid]大于k-gap,说明k-gapbob[mid]左边,右指针等于mid-1具体可看代码。


代码:


二分查找法尝尝几道题,还没过瘾|python代码









我是号主苏钟白

专注人文生活类文章创作

更有干货学习类文章分享

-扫码关注我呀-