二分查找
leetCode 题解
消灭猕猴桃
保持热爱,奔赴山海
展开
-
[leetCode]778. 水位上升的泳池中游泳
题目https://leetcode-cn.com/problems/swim-in-rising-water/二分查找如果在某一个时间 t0,可以从左上角到达右下角那么,当 t > t0 时仍然可以从左上角到达右下角,因此可以使用二分查找。根据提示给的范围在[0, N*N - 1]区间内猜一个数,然后进行深度优先搜索,或者广度优先搜索,搜索完毕时根据是否能到达左下角来确定如何缩小区间范围。class Solution { private int[][] dirs = ne原创 2021-01-30 15:44:05 · 102 阅读 · 0 评论 -
[leetCode]最小体力消耗路径
题目https://leetcode-cn.com/problems/path-with-minimum-effort/二分查找题目可以转化为:是否存在一条路径,该路径上的体力值不超过x,可以从左上角到达右下角假设x = x0时存在路径可以从左上角到达右下角,那么当x增大时原来的路径仍然可以使用。因此可以使用二分查找,每次估测一个x,然后进行广度或者深度优先搜索,最后根据能否到达右下角来缩小搜索范围。class Solution { private int[][] dirs =原创 2021-01-29 11:26:48 · 279 阅读 · 0 评论 -
[LeetCode]4.寻找两个有序数组的中位数
自己的解法 public double findMedianSortedArrays(int[] nums1, int[] nums2) { int[] nums = new int[nums1.length + nums2.length]; for(int i =0; i < nums1.length; i++){ nums[i] =...原创 2019-11-21 21:13:10 · 71 阅读 · 0 评论 -
[leetCode]287. 寻找重复数
题目https://leetcode-cn.com/problems/find-the-duplicate-number/solution/二分查找二分要弄清楚找的是什么,然后再确定查找的范围,然后确定如和缩小区间。抽屉原理:桌上有十个苹果,要把这十个苹果放到九个抽屉里,无论怎样放,我们会发现至少会有一个抽屉里面放不少于两个苹果。这题我们要查找的是一个整数,改整数的范围在[1, n],由抽屉原理可知如果数组中的元素小于等于 mid 的个数 严格大于 mid 则重复元素一定在[1,mid]原创 2021-01-24 21:25:16 · 78 阅读 · 0 评论 -
[leetCode]367. 有效的完全平方数
题目链接:https://leetcode-cn.com/problems/valid-perfect-square给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False。说明:不要使用任何内置的库函数,如 sqrt。示例 1:输入:16输出:True示例 2:输入:14输出:False二分查找假设一个数num能够刚好开方,那么开方的结果一定在2 到 num / 2之间,可以通过二分查找进行查询。class Solut原创 2020-12-07 16:23:26 · 141 阅读 · 0 评论 -
[leetCode]69. x 的平方根
解法一 袖珍计算器法思路:将开方运算转化为其他函数运算注意点:由于对数与指数运算都是浮点型运算,因此存在精度缺失的问题,因此在得到结果的整数部分 ans 后,我们应当找出 ans 与 ans+1 中哪一个是真正的答案。class Solution { /** *袖珍计算器法,使用对数、指数运算代替开方运算,时间复杂度O(1),空间复杂度O(1) */ public int mySqrt(int x) { if(x == 0) return 0;//对数真数原创 2020-07-01 11:10:39 · 132 阅读 · 0 评论 -
[leetCode]50. Pow(x, n)
题目https://leetcode-cn.com/problems/powx-n/快速幂 递归比如说210=25∗25,25=22∗22∗2,22=2∗22^{10} = 2^5 * 2^5,2^5=2^2*2^2*2,2^2=2*2210=25∗25,25=22∗22∗2,22=2∗2class Solution { public double myPow(double x, int n) { if (n == 0 || x == 1) re原创 2021-01-23 21:33:03 · 68 阅读 · 0 评论 -
[leetCode]702. 搜索长度未知的有序数组
题目https://leetcode-cn.com/problems/search-in-a-sorted-array-of-unknown-size/二分查找先确定右边界,为了保持对数时间复杂度需要成倍的增加right再使用二分查找查找目标值class Solution { public int search(ArrayReader reader, int target) { int left = 0, right = 1; while (rea原创 2021-01-23 19:30:38 · 185 阅读 · 0 评论 -
[leetCode]270. 最接近的二叉搜索树值
题目https://leetcode-cn.com/problems/closest-binary-search-tree-value/二分查找根据root值选选择在左子树中查找还是在右子树中查找class Solution { public int closestValue(TreeNode root, double target) { int closest = root.val; while (root != null) {原创 2021-01-23 19:15:49 · 206 阅读 · 0 评论 -
[leetCode]658. 找到 K 个最接近的元素
题目https://leetcode-cn.com/problems/find-k-closest-elements/双指针数组是排序的,使用双指针指向数组两端,如果一端离x更远就排除该指针指向的元素,如果一样远,根据题意排除右指针指向的元素class Solution { public List<Integer> findClosestElements(int[] arr, int k, int x) { int left = 0, right = arr原创 2021-01-23 16:08:02 · 93 阅读 · 0 评论 -
[leetCode]剑指 Offer 53 - I. 在排序数组中查找数字 I
解法 二分查找 直观解法是从前开始遍历,找到目标第一次出现的位置和最后一次出现的位置,通过两次位置相减得到目标值出现的次数。时间复杂度为O(n)。 可以通过改进二分查找,通过二分查找找到目标值第一次出现的位置和最后一次出现的位置,这样时间复杂度为O(logn)。 通常二分查找是将目标值k与数组中间位置的元素m进行比较。如果m>k,则在数组前半部分继续查找;如果m < k则在数组后半部分查找。那么如果m = k,由于需要找到目标值第一次出现的位置就需要判断m之前的元素是否等于k如果等于k则.原创 2020-09-16 10:25:05 · 80 阅读 · 0 评论 -
[leetCode]剑指 Offer 53 - II. 0~n-1中缺失的数字
二分查找 递归版 直观解法是求依据等差求和公式求0~n-1之和s1,然后求数组之和s2,通过s2-s1就能得到缺失值,但是这显然没有用到数组排序这一特性。 由于数组是排序的,因此某一数字m之前的数字和其下标应该相等,m及m之和的数字都大于其下标,因此可以使用二分查找将中间元素和相应下标进行比较。如果中间元素值等于下标则继续查找右半部分,如果大于下标并且左边的数也大于对应下标则继续查找左半部分,直到找到第一个元素值大于下标的元素。class Solution { public int miss.原创 2020-09-17 08:26:19 · 121 阅读 · 0 评论 -
[leetCode]162. 寻找峰值
题目https://leetcode-cn.com/problems/find-peak-element/二分查找通过中间值nums[mid] 与nums[mid + 1]来缩小搜索区间class Solution { public int findPeakElement(int[] nums) { int lo = 0, hi = nums.length - 1; while (lo < hi) { int mid = l原创 2021-01-23 13:12:17 · 53 阅读 · 0 评论 -
1095. 山脉数组中查找目标值
二分查找使用二分查找查找山脉数组的峰值位置将数组以峰值位置为分界线分为左右两部分,并分别使用二分查找查询目标值二分查找就是每次查找将范围缩小一半/** * // This is MountainArray's API interface. * // You should not implement it, or speculate about its implementation * interface MountainArray { * public int get(int..原创 2020-10-10 12:28:26 · 119 阅读 · 0 评论 -
[leetCode]1011. 在 D 天内送达包裹的能力
题目链接:https://leetcode-cn.com/problems/capacity-to-ship-packages-within-d-days传送带上的包裹必须在 D 天内从一个港口运送到另一个港口。传送带上的第 i 个包裹的重量为 weights[i]。每一天,我们都会按给出重量的顺序往传送带上装载包裹。我们装载的重量不会超过船的最大运载重量。返回能在 D 天内将传送带上的所有包裹送达的船的最低运载能力。二分查找此题与[leetCode]875. 爱吃香蕉的珂珂类似承载量的最原创 2020-12-20 14:14:27 · 92 阅读 · 0 评论 -
[leetCode]875. 爱吃香蕉的珂珂
题目链接:https://leetcode-cn.com/problems/koko-eating-bananas珂珂喜欢吃香蕉。这里有 N 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 H 小时后回来。珂珂可以决定她吃香蕉的速度 K (单位:根/小时)。每个小时,她将会选择一堆香蕉,从中吃掉 K 根。如果这堆香蕉少于 K 根,她将吃掉这堆的所有香蕉,然后这一小时内不会再吃更多的香蕉。珂珂喜欢慢慢吃,但仍然想在警卫回来前吃掉所有的香蕉。返回她可以在 H 小时内吃掉所有原创 2020-12-20 13:23:52 · 216 阅读 · 0 评论 -
[leetCode]744. 寻找比目标字母大的最小字母
题目链接:https://leetcode-cn.com/problems/find-smallest-letter-greater-than-target给你一个排序后的字符列表 letters ,列表中只包含小写英文字母。另给出一个目标字母 target,请你寻找在这一有序列表里比目标字母大的最小字母。在比较时,字母是依序循环出现的。举个例子:如果目标字母 target = ‘z’ 并且字符列表为 letters = [‘a’, ‘b’],则答案返回 ‘a’示例:输入:letters原创 2020-11-12 10:30:24 · 99 阅读 · 0 评论 -
[leetCode]34. 在排序数组中查找元素的第一个和最后一个位置
题目链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。你的算法时间复杂度必须是 O(log n) 级别。如果数组中不存在目标值,返回 [-1, -1]。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: [原创 2020-11-12 14:17:41 · 166 阅读 · 0 评论 -
[leetCode]剑指 Offer 11. 旋转数组的最小数字
class Solution { public int minArray(int[] numbers) { if( numbers == null || numbers.length == 0) return -1; int lo = 0, hi = numbers.length - 1; int mid = lo; //考虑旋转0个元素的特例 while( numbers[lo] >= numbers[hi] ) { .原创 2020-08-06 10:34:35 · 93 阅读 · 0 评论 -
[leetCode]33. 搜索旋转排序数组
题目https://leetcode-cn.com/problems/search-in-rotated-sorted-array/二分查找二分查找的最终目的是要减半搜索,这题通过判断左右端点的值可以判断哪一部分是有序的。如果target在有序部分则在有序部分查找,否则在无序部分查找。class Solution { public int search(int[] nums, int target) { return searchHelper(nums, target,原创 2021-01-20 09:05:49 · 65 阅读 · 0 评论 -
[leetCode]154. 寻找旋转排序数组中的最小值 II
题目https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array-ii/二分查找解题关键:通过nums[mid] 与 nums[hi] 的大小关系来缩小搜索区间class Solution { public int findMin(int[] nums) { // 确定搜索范围[lo, hi] int lo = 0; int hi = nums.length -原创 2021-01-24 15:13:57 · 62 阅读 · 0 评论 -
[leetCode]153. 寻找旋转排序数组中的最小值
题目链接:https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array假设按照升序排序的数组在预先未知的某个点上进行了旋转。例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] 。请找出其中最小的元素。示例 1:输入:nums = [3,4,5,1,2]输出:1示例 2:输入:nums = [4,5,6,7,0,1,2]输出:0示例 3:输入:nums = [1]输原创 2020-11-12 13:46:06 · 62 阅读 · 0 评论 -
[leetCode]278. 第一个错误的版本
题目链接:https://leetcode-cn.com/problems/first-bad-version你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。假设你有 n 个版本 [1, 2, …, n],你想找出导致之后所有版本出错的第一个错误的版本。你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错原创 2020-11-12 13:15:08 · 69 阅读 · 0 评论 -
[leetCode]540. 有序数组中的单一元素
题目链接:https://leetcode-cn.com/problems/single-element-in-a-sorted-array给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数。示例 1:输入: [1,1,2,3,3,4,4,8,8]输出: 2示例 2:输入: [3,3,7,7,10,11,11]输出: 10注意: 您的方案应该在 O(log n)时间复杂度和 O(1)空间复杂度中运行。二分查找由于只有一个数字出现一次所以整个数原创 2020-11-12 12:49:53 · 156 阅读 · 1 评论