
算法
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 评论 -
长度最小的子数组-双指针
题目给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。示例输入:target = 7, nums = [2,3,1,2,4,3]输出:2算法随着i变大,j的取值是单调的,不用每次从0开始。代码class Solution { public int mi.原创 2022-02-16 11:37:13 · 244 阅读 · 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,和一个目标值 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 评论 -
数组中的逆序对-归并
题目在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数示例输入: [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 评论 -
IPO-贪心
题目给你 n 个项目。对于每个项目 i ,它都有一个纯利润 profits[i] ,和启动该项目需要的最小资本 capital[i] 。最初,你的资本为 w 。当你完成一个项目时,你将获得纯利润,且利润将被添加到你的总资本中。总而言之,从给定项目中选择 最多 k 个不同项目的列表,以 最大化最终资本 ,并输出最终可获得的最多资本。示例输入:k = 2, w = 0, profits = [1,2,3], capital = [0,1,1]输出:4算法在可以做的前提下,优.原创 2022-02-13 15:22:59 · 175 阅读 · 0 评论 -
把数组排成最小的数
题目输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个示例输入: [3,30,34,5,9]输出: “3033459”算法先转换成字符串数组,然后排序。代码class Solution { public String minNumber(int[] nums) { int n = nums.length; String[] str = new String[n]; f.原创 2022-02-13 14:48:24 · 131 阅读 · 0 评论 -
分发饼干-贪心
题目对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。示例输入: g = [1,2], s = [1,2,3]输出: 2算法先排序优先用最低的代价满足胃口最低的小朋友代码class Solution { public int .原创 2022-02-13 14:41:37 · 152 阅读 · 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,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。示例输入:nums = [3,30,34,5,9]输出:“9534330”算法先把整数数组转换为字符串数组,然后写一个比较器,比较规则是两个字符串拼在一起后,谁大谁在前面。然后调用比较方法。代码class Solution { public String largestNumber(int[] nums) { int n = nums.length.原创 2022-02-13 11:21:58 · 403 阅读 · 0 评论 -
救生艇-贪心
贪心给定数组 people 。people[i]表示第 i 个人的体重 ,船的数量不限,每艘船可以承载的最大重量为 limit。每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。返回 承载所有人所需的最小船数 。示例输入:people = [3,5,3,4], limit = 5输出:4代码class Solution { public int numRescueBoats(int[] people, int limit) { A.原创 2022-02-13 11:08:46 · 84 阅读 · 0 评论 -
盛最多水的容器-贪心
题目给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。示例输入:[1,8,6,2,5,4,8,3,7]输出:49算法left指向左边,right指向右边,夹紧。夹紧过程中给长度不断变小,要想容积变大,只能高度变大,所以高度小的一边就要移动代码class Solutio.原创 2022-02-13 10:39:17 · 283 阅读 · 0 评论 -
矩阵中的路径-回溯
题目给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。示例输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCCED”输出:true.原创 2022-02-13 10:23:23 · 192 阅读 · 0 评论 -
递增子序列-回溯
题目给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。示例输入:nums = [4,6,7,7]输出:[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]代码class Solution { List<List<Integer>> res = new ArrayList<>(); .原创 2022-02-13 10:05:12 · 99 阅读 · 0 评论 -
子集II-回溯
题目给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。示例输入:nums = [1,2,2]输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]代码class Solution { List<List<Integer>> res = new ArrayList<>(); List<Integer> cur = new ArrayList<>().原创 2022-02-12 16:52:19 · 66 阅读 · 0 评论 -
组合-回溯
题目给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。示例输入:n = 1, k = 1输出:[[1]]代码class Solution { List<List<Integer>> res = new ArrayList<>(); List<Integer> cur = new ArrayList<>(); public void dfs(int n, int .原创 2022-02-12 16:29:17 · 79 阅读 · 0 评论 -
组合总和III-回溯
题目找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。示例输入: k = 3, n = 9输出: [[1,2,6], [1,3,5], [2,3,4]]代码class Solution { List<List<Integer>> res = new ArrayList<>(); List<Integer> cur = new ArrayList&l.原创 2022-02-12 16:24:22 · 159 阅读 · 0 评论 -
子集-回溯
题目给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。示例输入:nums = [1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]代码class Solution { List<List<Integer>> res = new ArrayList<>(); List<Integer> cur = new ArrayList.原创 2022-02-12 16:02:27 · 71 阅读 · 0 评论 -
组合总和II-回溯
题目给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用 一次 。实例输入: candidates = [2,5,2,1,2], target = 5,输出:[[1,2,2],[5]]代码class Solution { List<List<Integer>> res = new Ar.原创 2022-02-12 15:44:28 · 98 阅读 · 0 评论 -
全排列II-回溯
题目给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。示例输入:nums = [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]代码class Solution { List<List<Integer>> res = new ArrayList<>(); List<Integer> cur = new ArrayLis.原创 2022-02-12 11:39:51 · 79 阅读 · 0 评论 -
电话号码的字母组合-回溯
题目给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。示例输入:digits = “23”输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]代码class Solution { List<String> res = new ArrayList<>(); StringBuilder cur = new StringBuilder(); //.原创 2022-02-12 11:05:53 · 127 阅读 · 0 评论 -
24点游戏-回溯
题目给定一个长度为4的整数数组 cards 。你有 4 张卡片,每张卡片上都包含一个范围在 [1,9] 的数字。您应该使用运算符 [’+’, ‘-’, ‘*’, ‘/’] 和括号 ‘(’ 和 ‘)’ 将这些卡片上的数字排列成数学表达式,以获得值24。题目链接示例输入: cards = [4, 1, 8, 7]输出: true代码class Solution { // 把选的两个数删除,并且添加新的结果 public List<Double> get(L.原创 2022-02-12 10:42:26 · 2559 阅读 · 0 评论 -
组合总和-回溯
题目给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。题目链接示例输入:candidates = [2,3,6,7], target = 7输出:[[2,2,3],[7]]代码cl.原创 2022-02-12 10:09:38 · 61 阅读 · 0 评论 -
N皇后-回溯
题目皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。示例输入:n = 4输出:[[".Q…","…Q",“Q…”,"…Q."],["…Q.",“Q…”,"…Q",".Q…"]]算法注释代码class Solution { List<List<String>> res = new ArrayList<>(); char[][] cur; // 标记每一列是否用过.原创 2022-02-12 09:56:50 · 70 阅读 · 0 评论 -
字符串的排列-回溯
题目输入一个字符串,打印出该字符串中字符的所有排列。示例输入:s = “abc”输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”]代码class Solution { List<String> res = new ArrayList<>(); StringBuilder cur = new StringBuilder(); // 用于判重 HashSet<Integer> set.原创 2022-02-14 09:51:33 · 171 阅读 · 0 评论 -
复原IP地址-回溯
题目给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 ‘.’ 来形成。你不能重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。示例输入:s = “25525511135”输出:[“255.255.11.135”,“255.255.111.35”]代码class Solution { List<String> res = new ArrayList<>();.原创 2022-02-11 16:08:38 · 176 阅读 · 0 评论 -
全排列-回溯
题目给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案示例输入:nums = [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]代码class Solution { List<List<Integer>> res = new ArrayList<>(); List<Integer> cur = new.原创 2022-02-11 15:40:30 · 433 阅读 · 0 评论 -
不同路径II-动态规划
题目一个机器人位于一个 m x n 网格的左上角机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网格中的障碍物和空位置分别用 1 和 0 来表示。示例输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]输出:2算法1.dp[i]表示从(0,0)点到(i,j)的路径数2.要走到(i,j)点有两种办法,要么从(i-1,j)点向下走或者从(i,j-1)点向.原创 2022-02-11 15:05:13 · 128 阅读 · 0 评论 -
使用最小花费爬楼梯-动态规划
题目给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。请你计算并返回达到楼梯顶部的最低花费。示例输入:cost = [10,15,20]输出:15算法d[i]表示爬到第i级台阶所需的最小花费代码class Solution { // dp[i] 表示爬到第i阶台阶的最小花费 // 因为可从第0阶.原创 2022-02-11 14:59:05 · 162 阅读 · 0 评论 -
买卖股票的最好时机II-动态规划
题目给定一个数组 prices ,其中 prices[i] 表示股票第 i 天的价格。在每一天,你可能会决定购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以购买它,然后在 同一天 出售。返回 你能获得的 最大 利润 。示例输入: prices = [7,1,5,3,6,4]输出: 7算法dp[i][0]表示在第i天不持有股票赚的钱dp[i][1]表示在第i天持有股票转的钱代码public int maxProfit(int[] pric.原创 2022-02-11 14:47:28 · 63 阅读 · 0 评论 -
分割回文串-动态规划、回溯
题目给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。示例输入:s = “aab”输出:[[“a”,“a”,“b”],[“aa”,“b”]]算法注释代码class Solution { List<List<String>> res = new ArrayList<>(); List<String> cur = new ArrayList<&g.原创 2022-02-11 14:20:30 · 195 阅读 · 0 评论 -
回文子串-动态规划
题目给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。回文字符串 是正着读和倒过来读一样的字符串。子字符串 是字符串中的由连续字符组成的一个序列。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。示例输入:s = “abc”输出:3算法dp[i][j]表示s[i…j]是否是回文串只有但s[i]==s[j]时,才有可能是回文串如果i+1 >= j-1,则不需要看dp[i+1][j-1]是否是回文串否则,要看dp.原创 2022-02-11 12:01:36 · 242 阅读 · 0 评论 -
机器人的运动范围-bfs
题目地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?示例输入:m = 2, n = 3, k = 1输出:3算法dfs.原创 2022-02-11 11:01:21 · 67 阅读 · 0 评论 -
不同路径-动态规划
题目一个机器人位于一个 m x n 网格的左上角机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角。问总共有多少条不同的路径?示例输入:m = 3, n = 7输出:28算法dp[i][j]表示从(0,0)走到(i,j)的路径数目前一步要么从上面下来,要么从左边过来。dp[i][j] = dp[i-1][j] + dp[j][i-1]代码class Solution { public int uniquePaths(int m, int.原创 2022-02-11 10:33:56 · 83 阅读 · 0 评论