
二分搜索
逝水一战
重剑无锋,大巧不工
展开
-
避免洪水泛滥(leetcode1448)
问题描述:你的国家有无数个湖泊,所有湖泊一开始都是空的。当第 n个湖泊下雨的时候,如果第 n个湖泊是空的,那么它就会装满水,否则这个湖泊会发生洪水。你的目标是避免任意一个湖泊发生洪水。给你一个整数数组rains,其中:rains[i] > 0表示第 i天时,第 rains[i]个湖泊会下雨。rains[i] == 0表示第 i天没有湖泊会下雨,你可以选择 一个湖泊并 抽干这个湖泊的水。请返回一个数组ans,满足:ans.length == rains.le...原创 2020-06-22 16:02:01 · 888 阅读 · 0 评论 -
二分法的两个例子
问题一:转变数组后最接近目标值的数组和(leetcode1300)问题描述:给你一个整数数组arr 和一个目标值target ,请你返回一个整数value,使得将数组中所有大于value 的值变成value 后,数组的和最接近target(最接近表示两者之差的绝对值最小)。如果有多种使得和最接近target的方案,请你返回这些整数中的最小值。请注意,答案不一定是arr 中的数字。示例 1:输入:arr = [4,9,3], target = 10输出:3解...原创 2020-06-14 21:49:28 · 1968 阅读 · 0 评论 -
子数组和的最大值最小问题
顾名思义,将一个数组分为k个子数组,求解怎么分才可以使得这些子数组中和最大的值最小。案例一:在D天内送达包裹的能力传送带上的包裹必须在 D 天内从一个港口运送到另一个港口。传送带上的第 i个包裹的重量为weights[i]。每一天,我们都会按给出重量的顺序往传送带上装载包裹。我们装载的重量不会超过船的最大运载重量。返回能在 D 天内将传送带上的所有包裹送达的船的最低运载能力。输入:weights = [1,2,3,4,5,6,7,8,9,10], D = 5输出:15解释:船舶..原创 2020-05-24 11:30:06 · 1484 阅读 · 0 评论 -
子数组和问题II
本次的两个算法题是子数组的积的问题,勉强也能算做子数组和的问题。问题一:乘积小于k的子数组问题描述:给定一正整数数组以及一整数k,要求找到所有乘积小于k的子数组的个数。input : nums = [3 5 2 8] k = 17output: 7 解释: [3] [5] [2] [8] [3 5] [5 2] [2 8]解法一:前缀和 + 二分搜索看到题的第一反应还是用前缀和数组求解。但是由于是乘积可能会出现越界情况,因此对num求对数。此时的乘法就变为了加法。因...原创 2020-05-17 10:44:13 · 218 阅读 · 0 评论 -
有序数组转化为二叉树(leetcode108)
题目:将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1。示例:给定有序数组: [-10,-3,0,5,9],一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9 / /...原创 2019-12-22 10:42:15 · 283 阅读 · 0 评论 -
长度最小的子数组(二分查找 和 双指针滑动窗)
问题描述:给定一个含有n个正整数的数组和一个正整数s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回 0。示例:输入: s = 7, nums = [2,3,1,2,4,3]输出: 2解释: 子数组[4,3]是该条件下的长度最小的连续子数组来源:力扣(LeetCode)链接:https://leetcode-cn.co...原创 2019-11-19 11:11:15 · 157 阅读 · 0 评论 -
快速求一整数的K次方(二分查找)
问题描述:给定一整数K,N,求出啊K的N次方。若两数相乘时间复杂度为O(1),要求整体时间复杂度为O(logN)。大体思路:可以将N转化为二进制形式,将K^N转化为K的二进制各项方的结果之积。例如K = 8,N = 70:N = 64 + 4 + 2 ;8^70 = 8^ 64 * 8 ^4 * 8^2;可以一次计算8^1,8^2,8^4 .......8^64各项,可以发现...原创 2019-11-17 09:57:27 · 539 阅读 · 0 评论 -
完全二叉树的结点个数(二分查找)
题目描述:给定一完全二叉树头结点,返回该二叉树的结点个数,要求时间复杂度为低于O(logN)。大体思路:由于该二叉树为完全二叉树,所以其的两个子树至少有一个是满二叉树。有如下两种情况:可以发现左边的二叉树的根结点的左子树为满二叉树,右根结点的右子树为满二叉树。那么如何判断二叉树属于以上哪种情况呢?可以用右子树高度来判断,若右子树的高度 = 整体高度 - 1则说明右子...原创 2019-11-16 21:18:36 · 752 阅读 · 1 评论 -
找整型不重复有序数组中到值等于下标的元素
问题描述:给定一有序、不含重复元素的整型数组arr,找到满足arr[i] == i中最小的元素。要求时间复杂度为O(logN).实现思路:由于下标的增长速度始终为一,而arr的增长速度恒大于等于一,可以利用这一点将搜索域逐步减半;对中间元素进行判断若大于其下标,则可知后半段是不存在满足题设条件的解的;若小于其下标,同理前半段无可行解;等于时,之后无可行解。如此便可以O(logN)的...原创 2019-11-16 19:37:53 · 329 阅读 · 1 评论 -
循环有序数组中最小元素的查找(二分查找)
问题描述:如题,其中循环有序数组指的是对有序数组进行循环移位后的结果,如[7,8,9,0,1,2,3,4,5,6];实现思路:由循环有序数组结构可知,若数组不为整体有序,则最小值一定是处于无序子序列之中,如上述例子中,最小值一定处于7到1之间,而一定不处于1到6之间,根据该性质可以得到如下算法:先进行判断该数组是否整体有序(arr[left] < arr[right]),若有...原创 2019-11-15 19:58:34 · 2042 阅读 · 1 评论 -
局部小值的查找(二分查找)
问题描述:给定一任意相邻元素不重复的无序数组,找到其中任意一个局部最小值。(注:局部最小值的定义为该位置的元素小于其左右两个元素,对于首元素,只需小于后一个,尾元素小于前一个即可)大体思路:先进行首尾元素判断,若为局部最小值返回即可,否则从两边出发的趋势为下降的。如下图:由上图可知left到right之间一定存在局部最小点。mid = left + (right - lef...原创 2019-11-15 17:34:52 · 510 阅读 · 0 评论 -
二分查找(详尽版)
二分查找给定一有序的序列nums[],一个元素target,想要找到其中等于给定元素的下标。大体思路就是总是折半查找,通过比较给定元素与序列中间元素的大小,若nums[midIndex] > target,说明target的值在前半段,小于时在后半段。如此往复,即可得到结果。算法如此简单,但在具体实现过程中有些细节问题值得思考。如下就列出五种情况下的的二分查找。目录1.从nu...原创 2019-11-01 21:58:10 · 274 阅读 · 0 评论