二分
Betternw
这个作者很懒,什么都没留下…
展开
-
69 x的平方根
题目描述 实现 int sqrt(int x) 函数。 计算并返回 x 的平方根,其中 x 是非负整数。 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。 示例 1: 输入: 4 输出: 2 分析 使用二分查找,如果一个数 aa 的平方大于 xx ,那么 aa 一定不是 xx 的平方根。我们下一轮需要在 [0…a - 1][0…a−1] 区间里继续查找 xx 的平方根。 代码 public int mySqrt(int x) { // 特殊值判断 if (x ==原创 2021-07-16 16:18:41 · 185 阅读 · 0 评论 -
41 缺失的第一个正数
题目描述 给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 示例 1: 输入:nums = [1,2,0] 输出:3 代码 二分查找 public int firstMissingPositive(int[] nums) { int len = nums.length; Arrays.sort(nums); for (int i = 1; i <= l原创 2021-07-13 18:02:06 · 60 阅读 · 0 评论 -
35搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 思路分析 查找,想到二分查找——兼顾了查找和比较,且效率高。因此采用二分查找的方法。 代码实现 ...原创 2020-02-20 16:16:03 · 152 阅读 · 0 评论 -
【二分】 81 搜索旋转数组2
题目 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。 编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false。 输入: nums = [2,5,6,0,0,1,2], target = 0 输出: true 输入: nums = [2,5,6,0,0,1,2], target = 3 输出: false 思路 相似题 此题与33相似,唯一区别是会存在重复元素。当边界值重原创 2020-06-20 20:23:41 · 71 阅读 · 0 评论 -
【二分】 162 寻找峰值
题目 给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。 输入: nums = [1,2,1,3,5,6,4] 输出: 1 或 5 思路 采用二分查找。当mid小于后一个元素时,证明后半部分的峰值在【mid+1,结尾】处,——处于一个升序序列,当mid大于后一个元素时,证明峰值在【开头,mid】,还可能包括mid因为mid比后一个大——处于一个降序序列 代码 public int findPeakElement(int[] nums) { int l原创 2020-07-03 16:28:47 · 140 阅读 · 0 评论 -
【二分】 offer53-2 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和缺失最后一项的情况 二分法,返回放mid和索引相同时,证明在右边,最后返回的结果是右边界 代码 public int missingNumber(int[] nums) {原创 2020-07-11 10:55:44 · 94 阅读 · 0 评论 -
【二分】 offer53-1 在排序数组中查找数字
题目 统计一个数字在排序数组中出现的次数。 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: 2 示例 2: 输入: nums = [5,7,7,8,8,10], target = 6 输出: 0 思路 寻找右侧边界,寻找左侧边界,两次二分。注意边界的收缩。 二分总结 代码 public int search(int[] nums, int target) { //寻找右边界 int left = 0; int原创 2020-07-10 22:41:30 · 107 阅读 · 0 评论 -
【二分法总结!】offer11 旋转数组的最小数字
题目 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。 输入:[3,4,5,1,2] 输出:1 输入:[2,2,2,0,1] 输出:0 思路 根据左右节点位置的定义,来判断区间是闭的还是开的。 比如是左右闭合区间,那么在舍去中间位置的时候,指针就不指向中间位置 比如是左闭右开区间,那么在舍去中间位置的时候,右指针可以指向中间位置,因为取不原创 2020-07-04 17:04:58 · 73 阅读 · 0 评论 -
【二分 寻找左边界 收缩标准是小于mid的个数 HashSet】 287 寻找重复数
题目描述 给定一个包含n+1个整数的数组nums,其数字都在1到n之间(包括1和n),可知至少存在一个重复的整数,假设只有一个重复的整数,找出这个重复的数。 输入: [1,3,4,2,2] 输出:2 分析 注意长度和数字范围是有关系的。因此不能简单地用双指针。 二分法——可以用于确定一个有范围的整数 长度为n+1,每个数都在1-n之间,二分法确定left和right以及mid,如果小于mid的数字个数大于一半,则在小于部分区域,反之在大于部分区域。 代码 ...原创 2020-05-27 11:02:36 · 117 阅读 · 0 评论 -
【二分】 240 搜索二维矩阵
题目 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:每行的元素从左到右升序排列。 每列的元素从上到下升序排列 思路 从右上角开始搜索,如果当前值比目标值大,就向左走,如果当前值比目标值小,就向下走 代码 public boolean searchMatrix(int[][] matrix, int target) { if(matrix==null|| matrix.length < 1 || matrix[0].length &l原创 2020-07-02 14:45:37 · 132 阅读 · 0 评论 -
【二分(二分原理) 先寻右再寻左】 34 在排序数组中查找元素的第一个位置和最后一个位置
思路 二分查找 寻找一个数字 while(left<=right):是小于等于。因为left和right都是闭区间。 left = mid + 1,right = mid - 1:是加一减一。因为是闭区间。 int left = 0; int right = nums.length-1; while(left<=right){ int mid = left + (right - left) / 2; if(nums[mid] == target) return原创 2020-06-20 21:42:07 · 283 阅读 · 0 评论 -
【二分】 33 搜索旋转排序数组
题目 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。 搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。 你可以假设数组中不存在重复的元素。 输入: nums = [4,5,6,7,0,1,2], target = 0 输出: 4 输入: nums = [4,5,6,7,0,1,2], target = 3 输出: -1 思路 【看到有序数组就要想到二分查找!!!!!】 【原创 2020-06-20 20:04:40 · 69 阅读 · 0 评论