leetcode
leetcode
.番茄炒蛋
这个作者很懒,什么都没留下…
展开
-
024. 反转链表
【代码】024. 反转链表。原创 2023-01-03 19:20:40 · 97 阅读 · 0 评论 -
89. 格雷编码
题目链接思路格雷码简介初始化一个返回值res第一个整数是0;n位的格雷码就需要构建n次将之前的解照搬过来然后倒序把每个数加上1<<(n-1)添加到res中即可构建完成返回resjavapublic List<Integer> grayCode(int n) { List<Integer> res = new ArrayList<>(); res.add(0); for (int i = 1; i <= n;原创 2022-05-08 10:41:58 · 233 阅读 · 0 评论 -
买卖股票的最佳时机 II
题目链接思路在任何时候最多只能持有一支股票初始化res从1开始对数组进行循环;将当前元素减去上一个元素的值和0作比较然后累加到res每当res累加过一次0相当于卖出了一次股票;同时购入当天的股票最后返回resjavapublic int maxProfit(int[] prices) { int res = 0; for (int i = 1; i < prices.length; i++) { res += Math.ma原创 2022-05-04 22:21:20 · 347 阅读 · 0 评论 -
买卖股票的最佳时机
题目链接思路初始化res和min(历史最小值)对数组进行循环,如果当前值小于min就更新min如果不小于最小值;就更新res循环结束返回resjavapublic int maxProfit(int[] prices) { int res = 0; // 记录历史最小值 int min = Integer.MAX_VALUE; for (int price : prices) { if (price < min) {原创 2022-05-04 19:59:08 · 242 阅读 · 0 评论 -
只出现一次的数字
题目思路本来使用的是HashMap或者HashSet来做,但是时间复杂度过高;看了题解才知道是位运算方面的题位运算已知除了某个元素只出现一次以外,其余每个元素均出现两次.可以使用异或运算符(^)异或逻辑的关系是:当AB不同时,输出P=1;当AB相同时,输出P=0.其逻辑表达式为:P=A^B由于其他元素都出现了两次,因此把所有的元素全部都异或一下,只出现一次的元素就出来了;javapublic int singleNumber(int[] nums) {原创 2022-05-04 16:16:20 · 133 阅读 · 0 评论 -
169. 多数元素
题目链接思路可以使用HashMap记录每个元素的次数(key为元素value为出现的次数);最后将map中value超过数组长度一般的key返回也可以使用摩尔投票初始化res(返回值)和count(票数)循环数组;如果count为0;此时当前元素当选res如果当前元素等于res;count票+1如果当前元素不等于res;count票-1循环结束;返回resjavapublic int majorityElement(int[] nums) { int res = 0;原创 2022-05-03 16:43:51 · 149 阅读 · 0 评论 -
合并两个有序数组
题目链接思路双指针反向排序(从大到小);如果从小到大需要定义一个临时数组避免覆盖掉num1中的元素初始化idx1和idx2和sumLen;定义cur开始循环;结束条件idx1和idx2都小于0每次从两个数组的尾部取出较大的数字放置到nums1最后面;直至循环结束javapublic void merge(int[] nums1, int m, int[] nums2, int n) { int idx1 = m - 1; int idx2 = n -原创 2022-04-25 23:16:00 · 205 阅读 · 0 评论 -
78. 子集
题目链接思路使用回溯算法定义返回的res回溯算法三部曲确定回溯函数参数:void backtrack(int i, int[] nums, List<List> res, ArrayList list)确定递归结束条件:j < nums.length确定遍历过程:每次添加nums[j];递归调用;j+1其他参数不变;递归结束删除刚刚添加的nums[j]最后将res返回javapublic List<List<Integer>> subs原创 2022-04-25 19:42:38 · 46 阅读 · 0 评论 -
不同路径.
题目链接思路使用动态规划来解题dp[x][y] =dp[x-1][y]+dp[x][y-1]按常理需要定义一个二维数组或者两个一维数组进行计算;但是我们每次进行计算时,只需要当前行-1或者当前列-1;可以使用滚动数组的方式来优化一下空间javapublic int uniquePaths(int m, int n) { int[] cur = new int[n]; Arrays.fill(cur, 1); for (int x = 1; x < m; x++原创 2022-04-25 07:53:41 · 216 阅读 · 0 评论 -
70. 爬楼梯
题目链接思路这道题跟青蛙跳台阶问题相同;唯一不同的地方是不需要对1000000007取模;跟斐波那契数列类似;边界条件不一致青蛙跳台阶问题博客斐波那契数列博客之前两道题全部是用动态规划做的(基于数组)这次不使用数组进行操作初始化front和front1和res;从2循环到n每次循环更新front和front1和res最后返回resjavapublic int climbStairs(int n) { if (n == 0 || n == 1){ return原创 2022-04-24 20:57:39 · 245 阅读 · 0 评论 -
螺旋矩阵.
题目链接思路分层的去将数组中的元素返回定义上下左右四个临界节点;每次从上左->上右->右下->左下->上左注意:临界值避免多次使用或者不使用javapublic List<Integer> spiralOrder(int[][] matrix) { if (matrix == null || matrix.length == 0 || matrix[0].length == 0) { return new ArrayList<原创 2022-04-12 20:21:48 · 295 阅读 · 0 评论 -
最大子数组和
题目链接思路定义current和res对数组进行循环每次循环判断是将当前元素加入当前段还是另开一段,并且更新res的值最后将res返回javapublic int maxSubArray(int[] nums) { int current = 0; int res = nums[0]; for (int num : nums) { current = Math.max(num, current + num); res = Math.m原创 2022-04-11 21:50:33 · 266 阅读 · 0 评论 -
全排列..
题目链接思路使用回溯算法定义返回的res回溯算法三部曲确定回溯函数参数:void backtrack(int size, List output, List<List> res, int first)确定递归结束条件:first == size确定遍历过程:每次遍历交换下标i和first的元素;递归调用;first+1其他参数不变;递归结束将元素交换回来最后将res返回javapublic List<List<Integer>> permut原创 2022-04-09 16:26:04 · 323 阅读 · 0 评论 -
字符串相乘
题目链接思路对两个参数进行判断,如果有一个等于0;两数的乘积必然为0两个自然数的积的位数,等于这两个数的位数的和,或者比这个和少1使用数组储存两数的积;数组长度为两数长度之和两个倒序循环嵌套相乘;相乘时要注意进位和加上次进位的数字最后遍历数组,将数组中的元素拼接成字符串拼接的过程中;数组第一位元素如果是0需要省略;最后将拼接的字符串返回javapublic String multiply(String num1, String num2) { if ("0".equals(n原创 2022-04-08 22:56:08 · 472 阅读 · 0 评论 -
有效的括号
链接思路先对字符串的长度进行判断;如果字符串长度是奇数,那指定不能闭合利用栈LIFO(Last-In-First-Out)的特性来完成最先进来的左括号要最后闭合,最后进来的左括号要最先闭合使用Map把可能会出现的括号储存起来(右括号为key;左括号为value)循环字符串判断当前字符是否是右括号,如果是右括号,判断是否与栈尾形成闭合;如果不为闭合返回false如果是闭合就从栈里面把栈尾的左括号弹出如果不是右括号,就把当前字符加入到栈尾循环结束;如果栈内还有元素返回fal原创 2022-04-08 20:26:17 · 335 阅读 · 0 评论 -
搜索旋转排序数组
题目链接思路nums是升序排列的数组进行旋转后的int数组;里面不会有重复数组关于target,nums里面最多不会超过1个nums虽然经过旋转,但是肯定会有一半是有序的,另一半也可能有序使用二分查找来查询target定义left和right;开始循环:求出left和right的中间值mid如果mid的值等于target直接返回如果不等判断下标0是否小于等于下标mid相等,证明左边一半是有序的;判断target在不在左半边,如果在左半边移动right;不在左半边移动left原创 2022-04-08 00:07:59 · 697 阅读 · 0 评论 -
删除有序数组中的重复项
题目链接思路要求不使用额外的空间;并且要把不重复的数字放置再数组的前面已知数组是升序的,重复的数据必定是相邻的定义两个指针i,j;i是放置不重复元素的指针;j是对nums进行循环的指针对nums进行循环如果下标i的元素与下标j的元素相等;只移动j如果下标i的元素与下标j的元素不等;i和j都要移动如果j-i大于1,说明两个元素之间有重复元素;将下标j的元素赋值给下标i+1java public int removeDuplicates(int[] nums) {原创 2022-04-07 21:23:57 · 385 阅读 · 0 评论 -
合并K个升序链表
题目链接思路两个递归完成;将数组合并为当前数组长度的一半或一半-1组成新数组递归调用:获取数组长度;如果数组长度为0返回null;数组长度为1返回唯一的元素判断当前长度是否是偶数;如果是奇数先将最后两个元素合并为一个元素长度为偶数时除以2求出mid;对mid进行循环;将第i和第i+mid个元素进行合并然后将0到mid的元素组成一个新的数组进行递归调用两两合并递归调用:对两个ListNode分别判空,如果有空就返回另一个比较两个ListNode的val;递归两两调用参数为:较原创 2022-04-07 19:58:36 · 933 阅读 · 0 评论 -
最接近的三数之和
题目链接思路这道题与三数之和类似(三数之和解题思路)对nums进行排序,定义返回结果res循环res如果当前下标不等于0并且当前元素等于上一个元素,为避免重复,跳过此次循环定义left和right两个指针,left为当前下标+1;right为最后一个下标循环;结束条件:left不小于right求出当前元素和left和right的和sum如果sum等于target;返回sum如果sum不等于target;获取当前sum与target的差 (由于获取的是最接近的和,原创 2022-04-07 00:18:51 · 462 阅读 · 0 评论 -
三数之和.
题目链接思路如果nums为null或者长度小于3;返回null对nums进行排序;定义返回结果res循环nums如果当前元素大于0,后面的数越来越大,不会有符合条件的三个数,结束循环如果当前元素不是第一个并且与上一个重复跳过当前循环定义left和right两个指针;left为当前下标+1;right为最后一个下标循环:结束条件left不小于right求出当前元素和left和right的和sum如果sum等于0,记录当前3个元素到res里面;并且移动left和right;再移动的过原创 2022-04-06 21:22:33 · 374 阅读 · 0 评论 -
最长公共前缀
题目链接思路使用二分查找来找出最长公共前缀初始化left和right;left为0;right只能为数组中长度最短的字符串长度;最长的公共前缀长度也一定小于等于right循环;结束条件:left>right求出mid;使用判断left到mid这段子串是否为数组中的公共子串是公共子串:将left置为mid不是公共子串:将right置为mid-1最后0到left就是数组中的最长公共前缀;取出一个元素截取返回java public String longestCommon原创 2022-04-06 19:34:23 · 340 阅读 · 0 评论 -
最多水的容器
题目链接思路设置i,j两个指针分别指向height左右两端;决定水的容量是由i,j索引的较小的元素定义res用于返回,对height进行循环;比较height[i]与height[j]如果当前height[i]小于height[j]就拿i上面的元素乘以j和i的间隔与res相比获取当前最大容量;完事儿将i向右移动如果当前height[i]大于height[j]就拿j上面的元素乘以j和i的间隔与res相比获取当前最大容量完事儿将j向右移动将最大容量赋值给res最后将res返回jav原创 2022-04-05 21:46:43 · 324 阅读 · 0 评论 -
9. 回文数
题目链接思路这道题如果用整数转字符串就很简单;题目下面有进阶:你能不将整数转为字符串来解决这个问题吗?以0结尾并且非0的数字和负数均不是回文数定义num将后面一半的数字拼接到num上面如果x位数是奇数n,就拼接到num上n/2+1位如果x位数是偶数n,就拼接到num上n/2位拼接后,只要num等于x或者num除以10等于x都是回文数,反之不是java public boolean isPalindrome(int x) { if (x < 0 || (原创 2022-04-04 20:45:41 · 518 阅读 · 0 评论 -
字符串转换整数 (atoi)
题目链接思路将字符串转换为字符数组先过滤掉前面的空格定义一个布尔类型的flag去除空格后的第一个字符是’-'时:flag为false去除空格后的第一个字符是’+'时:flag为true;(没有符号时,默认true)定义返回值res;循环数组将数组中的数字累加到res上结束条件:循环至非数字字符或循环结束累加前需判断当前是否超过大于1<<31 - 1或者累加后是否大于1<<31 - 1不大于1<<31 - 1时:开始累加原创 2022-04-03 22:22:05 · 710 阅读 · 0 评论 -
7. 整数反转
题目链接思路定义res准备返回循环的将x从末尾到开头拼至res后面每次拼接时检查当前res是否超过32位的有符号整数的范围 [−231, 231 − 1]超过返回0不超过继续拼接循环结束;返回resjava public int reverse(int x) { int res = 0; while (x != 0) { if (res < Integer.MIN_VALUE / 10 || res > I原创 2022-04-03 16:25:47 · 207 阅读 · 0 评论 -
最长回文子串
题目链接思路"abcdcba"中"abcdcba"是回文子串;"bcdcb"也是回文子串初始化一个end和start动态规划:初始化一个boolean[ ] [ ] dp;dp[i][j]表示字符串第i到j是否回文如果dp[i][j]回文,那么dp[i+1][j-1]也一定回文采用i降序j升序嵌套遍历来保证判断dp[i][j]时,已经判断dp[i+1][j-1]当j-i>end-start时,将j和i分别赋值给end和start最后将字符串下标start到end返回注意:当出现j-原创 2022-04-02 21:49:21 · 536 阅读 · 0 评论 -
扑克牌中的顺子
题目链接思路限制条件数组长度为5数组的数取值为[0,13]顺子的条件5个数不能重复(0除外)最大值-最小值等于4,由于0可以看成任意数;最大值-最小值应小于等于4(小于5)java使用Set集合进行判重,发现重复直接返回false public boolean isStraight(int[] nums) { Set<Integer> set = new HashSet<>(5); int max = In原创 2022-04-02 05:02:38 · 211 阅读 · 0 评论 -
最小的k个数
题目链接思路返回原数组中最小的k个数的数组;从示例看出来返回的数组并不要求排序将原数组进行排序,只需要从小到大的将前k个数给排出来就好了将原数组下标0到k的元素组成数组返回java private int[] getLeastNumbers(int[] arr, int k) { if (k >= arr.length) { return arr; } for (int i = 0; i < k; i+原创 2022-04-01 21:25:39 · 348 阅读 · 0 评论 -
二叉搜索树的第k大节点
题目链接思路二叉搜索树,它或者是一棵空树,或者是具有下列性质的二叉树:若它的左子树不空,则左子树上所有结点的值均小于它的根节点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左,右子树也分别为二叉搜索树定义current和res;使用递归递归顺序为右->根->左如果递归至叶子节点结束递归每次递归current++;当current==k时;将当前节点的值赋值给res当current==k时结束递归递归结束将res返回java原创 2022-04-01 19:39:32 · 785 阅读 · 0 评论 -
二叉树中和为某一值的路径
题目链接思路递归查询;再查询的过程中记录所走的路径每走一步判断当前是否是叶子节点,以及路径和是否与target相等满足条件就加入到结果里面不满足条件就继续递归,直至递归到叶子节点每次结束需要回退到父节点时,要把记录的当前的路径给清除掉java public List<List<Integer>> pathSum(TreeNode root, int target) { List<List<Integer>> re原创 2022-03-31 21:15:19 · 698 阅读 · 0 评论 -
把数字翻译成字符串
题目链接思路示例:12258有5种不同的翻译,分别是"bccfi",“bwfi”,“bczi”, “mcfi"和"mzi”对于12258来说;1225可以是12+c+f也可以是12+z;动态规划:dp[i]以第i个数字结尾的当前数字串拥有之前的数字串的方法数如果相邻的两个数字组成大于等于10并且小于等于25的数;dp[i] = dp[i-1]+dp[i-2]如果相邻的两个数字组成小于10或者大于25的数;dp[i] = dp[i-1]java public int trans原创 2022-03-31 20:16:49 · 836 阅读 · 0 评论 -
礼物的最大价值
题目链接思路需要计算从左上角到右下角最大途径值;并且规定只能向下或者右移动右下角最大值取决于:右下角左边元素值和右下角上边元素值那个大,将较大的值加到右下角值本身就可以了将数组进行循环,记录到当前坐标的最大值;记录时需要判断以下条件:当前列和行都为0时,当前元素就是起点,起点不用累加当前列或者行等于0时,是只能从一个方向到达的当前列和行都不为0时,需要比较当前元素的上边和左边元素,将较大值累加到当前坐标最后将数组中右下角的值返回即可java public int maxV原创 2022-03-30 22:51:05 · 386 阅读 · 0 评论 -
股票的最大利润
题目链接思路数组元素是按照时间先后顺序存储再数组中的,求第n天的润时,只能拿prices[n]去减下标索引小于n的元素记录max与min;循环数组,每次循环拿当前元素减再此下标之前最小的元素求出最大利润,再与一直记录的max相比循环结束返回maxjava public int maxProfit(int[] prices) { if (prices == null || prices.length <= 1) { return 0;原创 2022-03-30 21:17:02 · 168 阅读 · 0 评论 -
青蛙跳台阶问题
题目链接思路假如青蛙跳上n级台阶有f(n)种跳法;再所有跳法中,青蛙的最后一步有且仅有两种情况:跳1级/2级台阶:当青蛙跳1级台阶时,前面已跳的n-1级台阶,共有f(n-1)种跳法当青蛙跳2级台阶时,前面已跳的n-2级台阶,共有f(n-2)种跳法f(n)为以上两种情况之和,即f(n)=f(n-1)+f(n-2).与斐波那契数列是一样的,不一样的是边界条件:青蛙跳台阶:示例n=0;结果为1;即f(0)=1;f(1)=1;斐波那契数列:f(0)=0;f(1)=1斐波那契数列博客原创 2022-03-30 19:57:21 · 592 阅读 · 0 评论 -
树的子结构
题目链接思路比较A,B两个节点,如果根不同就拿A.Left和A.Right与B对比如果A,B两个根节点相同,就拿A.Left和B.Left;A.Right和B.Rught对比;直至将B对比完毕返回true如果将A对比完毕都没有与B相同的结构返回falsejava public boolean isSubStructure(TreeNode A, TreeNode B) { if (A == null || B== null){ //约定空树不是任原创 2022-03-29 20:21:23 · 841 阅读 · 0 评论 -
矩阵中的路径
题目链接思路将word转换成数组循环board,单个单个字符去匹配;如果当前字符匹配成功,就去上下左右方向匹配下一个字符,如果全部匹配成功返回trueboard循环结束还没匹配成功返回falsejava public boolean exist(char[][] board, String word) { char[] wordArr = word.toCharArray(); for (int x = 0; x < board.lengt原创 2022-03-28 20:09:02 · 407 阅读 · 0 评论 -
旋转数组的最小数字
题目链接思路数组可能会存在重复数据;原来是一个升序数组,并进行了1至n次的旋转定义三个下标,min,mid,max如果numbers[mid]<numbers[max];从左到右递增,最小数字应该再mid左边;排除mid右边一半如果numbers[mid]>numbers[max];从左到右递减,最小数字应该再mid右边;排除mid左边一半如果numbers[mid]==numbers[max];min到max区间就是最小数字所在处,没办法排除了;循环这个区间找到最小数字返回原创 2022-03-24 20:08:38 · 422 阅读 · 0 评论 -
二维数组中的查找
题目链接思路在一个二维数组(矩形)中,每一行从左到右每一列从上到下都依次递增将矩形的左下角设置为起点,开始对数组进行循环如果当前元素大于target就排除当前列如果当前元素小于target就排除当前行如果等于返回true如果到最后都没有找到target就返回falsejava public boolean findNumberIn2DArray(int[][] matrix, int target) { int x = 0; int y =原创 2022-03-23 20:25:38 · 426 阅读 · 0 评论 -
替换空格.
题目链接思路思路一可以定义一个当前字符串三倍长的数组对当前字符串进行循环如果当前字符是空格,就按顺序将%,2,0添加到数组如果当前字符不是空格,就将当前值添加到数组最后将数组有值那一部分转换成String返回思路二java可以使用StringBuilder进行拼接返回对字符串进行循环如果当前字符是空格,就再StringBuilder后面拼接%20如果当前字符不是空格,就再StringBuilder后面拼接原值循环结束将StringBuilder返回j原创 2022-03-22 19:59:37 · 89 阅读 · 0 评论 -
复杂链表的复制
题目链接思路链表的复制,因为涉及到next指针和random指针创建Map<Node,Node>来存储Node,用两次循环完成复制第一次循环:参数Node作为key,创建一个val相同的Node作为value第二次循环:为map中所有的value创建next指针和random指针返回map中key为head的valuejava public Node copyRandomList(Node head) { Map<Node, Nod原创 2022-03-21 22:17:30 · 384 阅读 · 0 评论