
分治
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 · 211 阅读 · 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 · 493 阅读 · 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 · 570 阅读 · 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 · 458 阅读 · 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 · 234 阅读 · 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 · 683 阅读 · 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 · 152 阅读 · 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 · 290 阅读 · 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 · 99 阅读 · 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 · 194 阅读 · 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 · 227 阅读 · 0 评论 -
供暖期-分治
题目在加热器的加热半径范围内的每个房屋都可以获得供暖。现在,给出位于一条水平线上的房屋 houses 和供暖器 heaters 的位置,请你找出并返回可以覆盖所有房屋的最小加热半径。示例输入: houses = [1,2,3,4], heaters = [1,4]输出: 1算法二分搜索合适的半径:半径最小值为0,最大值为供暖器和房子的最远位置小于最优解的半径一定不能供暖所有房子大于最优解的半径一定可以供暖所有房子所以可以二分查找到最优解二分查找时,当满足供暖要求.原创 2022-02-13 16:51:30 · 228 阅读 · 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 · 264 阅读 · 0 评论