当前位置: 首页 > Web前端 > JavaScript

前端工程师leetcode算法面试必备-二分查找算法(下)_1

时间:2023-03-27 16:38:24 JavaScript

1.287.查找重复给定一个包含n+1个整数的数组nums,其中的数字都在1到n之间(包括1和n),它可见至少有一个重复的整数。假设只有一个重复整数,求重复数。1.HashMap在没有其他附加条件的情况下,读者会立刻想到用HashMap来记录出现过的数字,从而求出重复次数:上述实现代码的时间复杂度和空间复杂度都是O(n),如果只允许O(1)的空间复杂度,如何解决这个问题?2.BinarySearch在这种情况下,最容易想到的方法是通过暴力的双循环来搜索当前数是否与后面的数重复,但是这个解法的时间复杂度是O(n^2),既然要查找,可以尝试通过二分查找算法将时间复杂度降低到O(nlogn)。根据之前刷题的经验,很容易找到一个有序数组:一个从1到n的整数递增序列。接下来的难点是通过重复数的特征来判断下一轮搜索区间是落在左半区间还是右半区间:首先需要遍历nums数组,得到不大于的数比当前的中间数;如果大于中间数,则下一轮搜索区间落在左半区间;如果小于中间数,则下一轮搜索区间落在右半区间;一个整数数组和一个正整数s,求数组中和≥s的最小连续子数组。如果没有满足条件的连续子??数组,则返回0。1.二分查找这道题的有序数组不好找,需要一个技巧:构造前缀和数组。nums=[2,3,1,2,4,3]#prefixandsums=[0,2,5,6,8,12,15]在上面的例子中,可以发现prefix和sums数组是一个有序数组,那么对于任意一个从i到j的连续子数组,求和可以通过sums[j+1]-sums[i]来计算。并且根据前缀和与s之差的比较,可以判断满足条件的连续子??数组的末尾下标落在哪个区间。参考视频:传送门通过数组的前缀和预处理和二分查找算法,时间复杂度为O(nlogn)。2.两点除了上述二分查找算法的处理方法外,最简单暴力的方法是通过嵌套循环寻找最小的连续子数组,但该方法的时间复杂度为O(n^2),有什么办法可以降低到O(n)的时间复杂度吗?.这里需要提一下滑动窗口算法,它常被用来处理子元素连续的问题,将嵌套循环问题转化为单循环问题。本题通过头指针和尾指针维护当前连续子数组的和值窗口:当前窗口的和值大于s,则头指针向后移动一位;当前窗口的和值小于s,则尾指针向后移动一位;三、153.在旋转排序的数组中找到最小值假设一个按升序排序的数组在预先未知的某个点旋转。(例如,数组[0,1,2,4,5,6,7]可能变为[4,5,6,7,0,1,2])。请找出其中最小的元素。您可以假设数组中没有重复元素。这类话题在Easy也出现过,比如:【852.山阵的峰值指数]和[162。寻找高峰]。本题将原来的递增数组转化为包含两个递增序列的数组,并且其中没有重复的元素,则可以得出第一个递增数组中的任意一个元素都大于第二个递增数组中的元素.有了这个关键信息,对于任何一个中间数,都可以和当前搜索区间的最后一个元素进行比较,从而知道当前中间数在哪个递增序列上,求得的最小值存在于第二个的头部一个递增的序列,然后在这个方向上不断缩小搜索区间,可以得到最小值:Ⅳ.33.搜索旋转排序的数组假设按升序排序的数组在事先未知的点旋转。(例如,数组[0,1,2,4,5,6,7]可能变为[4,5,6,7,0,1,2])。搜索给定的目标值,如果它存在于数组中则返回其索引,否则返回-1。您可以假设数组中没有重复元素。你的算法时间复杂度必须是O(logn)级别。本题属于[153.在旋转排序数组中找到最小值]。153只需要将搜索区间缩小到第二个递增区间就可以得到最小值。但是这道题中目标值的位置是不确定的,所以在每次确定搜索区间的时候,需要考虑很多情况:如果当前的搜索区间只是落在一个递增的区间上,那么和一般的搜索区间没有区别处理方法;如果当前搜索区间跨越两个递增区间,则需要根据中间数在第一个递增区间或第二个递增区间分别处理;具体的条件判断可以参考下面的代码实现:五、81.搜索旋转排序ArrayII假设升序排列的数组在事先未知的某个点进行了旋转。(例如,数组[0,0,1,2,2,5,6]可能变为[2,5,6,0,0,1,2])。编写一个函数来确定给定的目标值是否存在于数组中。如果存在则返回true,否则返回false。本题在[33.搜索旋转排序数组]。复习第33题的解法,寻找下一个搜索区间时,比较搜索区间的头元素和尾元素,判断当前搜索区间是否跨越两个递增序列。一旦不存在不重复元素的条件,就无法根据头尾两个元素判断当前搜索区间是否跨越两个递增序列。这道题需要计算元素的存在性,所以一个元素的重复元素对其存在性没有影响,所以只要在二分查找的过程中剔除头部和尾部的重复元素即可:写在算法的最后作为计算机学科的基础,用JavaScript来刷,一点都不丢人ε=ε=ε=┏(゜ロツ;)┛。本系列文章将总结算法的三种难度(简单难度、中等难度和困难难度)。简单难度会介绍算法的基础知识和实现,另外两个难度会重点讲解解题思路。如果本文对您有帮助,可以点赞或关注,鼓励博主。