
二分
二分算法题
九幽孤翎
蜉蝣只有认清自己的渺小,才能有化茧成蝶的一天
展开
-
Leetcode_436_寻找右区间_二分
好久没写二分了,这种upper和lower的二分用target这种方式写很方便,如果满足条件,就记录target,需要注意的是这里的end是开区间。 import java.util.Arrays; import java.util.Comparator; class Solution { static class Node { int index; int[] values; public Node(int index, int[] values原创 2022-05-20 08:59:02 · 231 阅读 · 1 评论 -
Leetcode_剑指Offer04_二维数组中的查找_二分/线性查找
前两天一面的原题,二分还是效率最高的做法,使用那个删行/列复杂度还是有点高 class Solution { public boolean findNumberIn2DArray(int[][] matrix, int target) { int n = matrix.length; if(n == 0) { return false; } int m = matrix[0].length; if原创 2022-03-07 09:26:46 · 176 阅读 · 0 评论 -
Leetcode_剑指offer11_旋转数组的最小数字_二分
我也不知道我是怎么过的? class Solution { public int minArray(int[] numbers) { int len = numbers.length; int l = 1; int r = len - 1; while(l <= r) { int mid = (l + r) >> 1; if(numbers[mid] < numbe原创 2022-03-04 16:58:53 · 128 阅读 · 0 评论 -
Leetcode_540_有序数组的单一元素_二分
这题核心是在二分移动哪个边界上 我们最终会以l=r作为终止条件,每一次判断mid,我们都会移动其中一端的边界,因为这道题中如果满足nums[mid] == nums[mid ^ 1]的条件,代表答案在(mid, r]中,肯定不包含mid,所以我们可以将l修改为mid+1 class Solution { public int singleNonDuplicate(int[] nums) { int n = nums.length; int l = 0, r = n -原创 2022-02-14 11:38:49 · 266 阅读 · 0 评论 -
Leetcode_1414_和为k的最少斐波那契数字数目_二分查找
注意一下binarySearch的返回值,当找不到的时候,会返回(-插入值-1),插入值是这个元素应该插入的位置,我们要找的是,比这个数小一点的数,所以我们需要减去-index-2下标的数。 class Solution { public int findMinFibonacciNumbers(int k) { int[] temp = new int[45]; temp[0] = 1; temp[1] = 1; int i;原创 2022-02-03 12:47:03 · 1370 阅读 · 0 评论 -
Leetcode_31_下一个排列_二分
先举个例子吧 12452568691531,我们要找这个数的下一个排列,相当于找1531的下一个排列,然后拼接前面的若干个数。 算法如下: 我们先从后往前找,找到一个数比它前一个数要大 1245256869 1531 我们将最后这个1531分开来,现在我们要做的就是将1和后面这个531中,比1稍微大一点点的数,进行交换,然后把交换后的后面几个数,进行排序。 为什么那么做呢,我们观察样例,就可以发现,实际上发生改变的,是原数组中,是一个终点为末尾的最长递减序列【实际上也可能只有一个数原创 2021-08-21 20:55:13 · 90 阅读 · 0 评论 -
Leetcode_300_最长递增子序列_动态规划+二分
class Solution { public int lengthOfLIS(int[] nums) { ArrayList<Integer> dp = new ArrayList<>(); for (int num : nums) { int len = dp.size(); if (len == 0 || num > dp.get(len - 1)) {原创 2021-05-11 15:19:03 · 111 阅读 · 0 评论 -
Leetcode_33_搜索旋转排序数组_二分
我们知道,对于有序数组,可以使用二分查找 而这个经过旋转排序的,前后是部分有序的, 我们可以先判断首个元素和target的关系 来确定target是在数组的前后哪个部分 class Solution { public int search(int[] nums, int target) { int st = 0; int ed = nums.length - 1; if (target >= nums[0]) { whi原创 2021-04-29 23:59:49 · 114 阅读 · 0 评论