分治
wjy_1126
这个作者很懒,什么都没留下…
展开
-
有效的完全平方数-二分
题目 给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。 示例 输入:num = 16 输出:true 算法 二分 代码 class Solution { public boolean isPerfectSquare(int num) { int left = 0; int right = num; while (left <= right) { .原创 2022-02-16 11:53:06 · 182 阅读 · 0 评论 -
搜索二维矩阵-二分
题目 编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性: 每行中的整数从左到右按升序排列。 每行的第一个整数大于前一行的最后一个整数。 示例 输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3 输出:true 算法 将一维坐标转换为二维坐标,然后二分 代码 class Solution { public boolean searchMatrix(int[][] .原创 2022-02-16 11:47:20 · 438 阅读 · 0 评论 -
搜索二维矩阵II
题目 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例 输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5 输出:true 算法 每次检查右上角的元素 如果右上角元素更大,去掉右边一列的元素 如果右上角元素更小.原创 2022-02-16 10:47:21 · 508 阅读 · 0 评论 -
搜索插入位置-二分
题目 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 示例 输入: nums = [1,3,5,6], target = 5 输出: 2 算法 左边都满足小于targget,右边都不满足。 找第一个不满足条件的点。 代码 class Solution { public int searchInsert(int[] nums, int target) { int left = 0; .原创 2022-02-16 10:17:48 · 423 阅读 · 0 评论 -
x的平方根-二分
题目 给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 示例 输入:x = 4 输出:2 算法 注释 代码 class Solution { public int mySqrt(int x) { int left = 1; int right = x; while (left <= right) { int mid = left + (right - left) / 2; .原创 2022-02-16 10:12:18 · 203 阅读 · 0 评论 -
有效三角形的个数-贪心、二分
题目 给定一个包含非负整数的数组 nums ,返回其中可以组成三角形三条边的三元组个数。 示例 输入: nums = [4,2,3,4] 输出: 4 算法 先排序 对于每一个确定的nums[i]点,从它的前面找出能组成三角形的两个点 left = 0, right = i - 1; 如果此时可以组成三角形(nums[left] + num[right] > nums[i]),则nums[left] ~num[right-1]都可以与num[right]和nums[i]组成三角形 .原创 2022-02-13 12:07:57 · 608 阅读 · 1 评论 -
在排序数组中查找元素的第一个和最后一个位置-二分
题目 给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 示例 输入:nums = [5,7,7,8,8,10], target = 8 输出:[3,4] 算法 注释 代码 class Solution { // 寻找左边界 public int findLeft(int[] nums, int target) { int.原创 2022-02-15 16:18:50 · 129 阅读 · 0 评论 -
寻找峰值-二分
题目 给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。 你可以假设 nums[-1] = nums[n] = -∞ 。 你必须实现时间复杂度为 O(log n) 的算法来解决此问题。 示例 输入:nums = [1,2,3,1] 输出:2 算法 注意:此题不会出现nums[i] == nums[i+1]的情况 如果nums[mid] < nums[mid+1],说明,处在上升阶段,只要处在上升阶段,就让l.原创 2022-02-15 14:46:51 · 260 阅读 · 0 评论 -
最长递增子序列-动态规划、二分
题目 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。 处。 示例 输入:nums = [10,9,2,5,3,7,101,18] 输出:4 算法 dp[i]表示以nums[i]点结尾的最长递增子序列的长度 nums[i]之前的所有比nums[i]小的点都可以是nums[i]之前的点 dp[i] = max(dp.原创 2022-02-10 15:40:59 · 67 阅读 · 0 评论 -
数组中的逆序对-归并
题目 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数 示例 输入: [7,5,6,4] 输出: 5 算法 求逆序对,就是求每个数前面有几个数比他大。 在归并排序时,当左组中的nums[i]>右组中的nums[j]时,共有mid-i+1个数比nums[j]大 所以可以利用归并排序解决 代码 class Solution { public int merge(int[] nums, int le.原创 2022-02-15 11:07:00 · 140 阅读 · 0 评论 -
旋转数组的最小数字-二分
题目 给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的最小值为1。 示例 输入:[3,4,5,1,2] 输出:1 算法 先考虑无重复数字且可定反转了的情况,以nums[0]为分界点,左边的数组全部满足nums[i]>=nums[0],右边的数组都不满足nums[i]>=nums[0]. 因此可以使用二分.原创 2022-02-15 10:43:12 · 198 阅读 · 0 评论 -
供暖期-分治
题目 在加热器的加热半径范围内的每个房屋都可以获得供暖。 现在,给出位于一条水平线上的房屋 houses 和供暖器 heaters 的位置,请你找出并返回可以覆盖所有房屋的最小加热半径。 示例 输入: houses = [1,2,3,4], heaters = [1,4] 输出: 1 算法 二分搜索合适的半径: 半径最小值为0,最大值为供暖器和房子的最远位置 小于最优解的半径一定不能供暖所有房子 大于最优解的半径一定可以供暖所有房子 所以可以二分查找到最优解 二分查找时,当满足供暖要求.原创 2022-02-13 16:51:30 · 196 阅读 · 0 评论 -
最大子数组和-动态规划、分治
题目 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。 示例 输入:nums = [-2,1,-3,4,-1,2,1,-5,4] 输出:6 动态规划算法 dp[i]表示以nums[i]为结尾的连续子数组的最大和 以nums[i]为结尾的连续子数组的最大和有两种情况 情况1.nums[i]孤身一人,即dp[i] = nums[i] 情况2.nums[i]前面有人,即dp[i] = dp[i-1] +.原创 2022-02-09 16:35:48 · 210 阅读 · 0 评论