![](https://img-blog.csdnimg.cn/20190927151132530.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
LeetCode
leetcode 刷题
houjibofa2050
读源码,要有技术深度,做一个把一招练一万遍的程序员。
展开
-
leetcode Perfect Squares
一个数可以写几个数的平方数,最少的平方的个数解题思路:动态规划 dp[i]=min(dp[i-j*j]+1) j=1,2,..m m=sqrt(i)public static void main(String[] args) { int num=12; int i = numSquares(num); System.out.pri...原创 2018-12-19 21:56:35 · 71 阅读 · 0 评论 -
动态规划---最长公共子序列和最长公共子串
问题1. 给定两个字符串,求最长公共子序列。例如问题2. 给定两个字符串,求最长公共子串解题方法:动态规划最长公共子序列转移方程dp[i][j]代表以尾巴字符结尾的最长的公共子序列最长公共子串状态转移方程dp[i][j]代表以尾巴字符结尾的最长的公共子串代码如下/** @Description: 参考博客 1.https://writings.sh/post/algorithm-longest-common-substring-and-longest-co原创 2022-03-22 09:04:37 · 855 阅读 · 0 评论 -
leetcode 二叉树中和为某一值的路径
1.题目:二叉树中和为某一值的路径力扣2.解决方案递归+回溯代码如下 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } .原创 2021-09-22 16:58:26 · 165 阅读 · 0 评论 -
Leetcode 1017. 负二进制转换
题目输入:2输出:"110"解释:(-2) ^ 2 + (-2) ^ 1 = 2解决方案1.r=-22.s=p*r+q3.q<0 q=q-r p=p+14.q>0 q,p保持不变代码如下public static void main(String[] args) { String s = baseNeg2(2); System.out.println(s); } // r=-2 //s=p.原创 2021-09-16 20:44:42 · 184 阅读 · 0 评论 -
leetcode 5. 最长回文子串
题目给你一个字符串s,找到s中最长的回文子串。s = "babad" 输出:"bab"解决方案1.动态规划2.中心扩展法 中心扩展法时间复杂度O(N^2),核心思想:把每一个节点作为中心节点,向两侧进行扩展。有个重要的预处理操作是每个字符中插入一个#,这样就不用区分处理奇数长度的回文串和偶数长度的回文串代码如下 //中心扩展法 public static String longestPalindrome(String s) { ...原创 2021-09-11 12:22:32 · 127 阅读 · 0 评论 -
leetcode Offer 29. 顺时针打印矩阵
1.题目输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。2.解决方案import java.util.ArrayList;import java.util.List;public class Test031 { public static void main(String[] args) { int[][] arr={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}}; Li...原创 2021-09-10 19:14:25 · 109 阅读 · 0 评论 -
leetcode 977. 有序数组的平方
题目 给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。解决办法1.双指针每次计算最大的值,复制到新数组中。时间复杂度O(n),空间复杂度O(n)代码如下: public static void main(String[] args) { int[] arr={-4,-1,0,3,10}; int[] ans = sortedSquares(arr); ...原创 2021-09-10 13:05:46 · 58 阅读 · 0 评论 -
剑指offer 面试题13 机器人的运动范围
解题思路:回溯法 public static void main(String[] args) { int num = getNum(12); System.out.println(num); int rows=10; int cols=10; int threshold=5; int i = m...原创 2019-01-06 23:30:06 · 250 阅读 · 0 评论 -
剑指offer 面试题11 旋转数组中的最小数字
时间复杂度O(logN) 解题思路:1.旋转数组是两段递增的序列,如果 中间元素==左端元素== 右端元素 从前到后遍历元素如果中间元素>=左端元素 最小值在第二段,更新左端指针,如果中间元素<左端元素 && 中间元素<右端元素 ,最小值在第一段,更新右边的指针。public static void main(String[] arg...原创 2019-01-01 19:54:24 · 80 阅读 · 0 评论 -
剑指offer 12.矩阵中的路径
剑指offer 12.矩阵中的路径解题思路:回溯法,创建一个boolean[] 数组,记录每个字符是否被使用过,从上下左右四个方向递归搜索,如果下一个字符符合提哦案件,继续递归,如果不符合,让当前字符标记为没有使用。public static void main(String[] args) { char[] matrix={'A','B','C','E','S','...原创 2019-01-01 21:34:07 · 289 阅读 · 0 评论 -
leetcode 206. 反转链表 go 语言实现
递归实现与非递归实现,以及头插法/** * @Description: 反转链表 非递归方式 * * @Date: * @Author: fuGuoWen * @Return * @Throws */func reverseList(head *ListNode) *ListNode { var pre *ListNode var next *ListNode for head != nil { next = head.Next head.Next = pre pr原创 2020-06-28 22:12:11 · 139 阅读 · 0 评论 -
leetcode 92. 反转链表 II java 实现和go 实现
对指定范围的链表,实现反转public class Test52 { public static void main(String[] args) { ListNode listNode1=new ListNode(1); ListNode listNode2=new ListNode(2); ListNode listNode3=new ListNode(3); ListNode listNode4=new ListNode(原创 2020-06-28 22:02:41 · 176 阅读 · 0 评论 -
剑指 Offer 36. 二叉搜索树与双向链表
题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。排序 节点从小到大排序,中序遍历节点双向链表 当前节点和前一个节点 tail.right=cur cur.left=tail循环链表 设置链表的头结点和尾节点 head.right=tail tail.left=head代码实现:public class Test30 { /** 定义双向链表的头结点和尾节点 */ Node ...原创 2020-06-19 21:46:17 · 91 阅读 · 0 评论 -
239. 滑动窗口最大值
滑动窗口的最大值解题思路:使用单调的双端队列,可以实现滑动窗口最大值的 O(n)的时间复杂度 public static void main(String[] args) { /** 数组 */ int[] arr={1,3,-1,-3,5,3,6,7}; /** 滑动窗口的大小 */ int k=3;// int[] arr={1,-1};// int k=1; int[] ..原创 2020-06-16 13:28:31 · 105 阅读 · 0 评论 -
leetcode 260,136,137 数字只出现一次
数字只出现一次代码: public static void main(String[] args) {// int[] arr = {2, 2, 1};// int num = singleNumber(arr);// System.out.println(num);// int[] arr={2,1,2,3,4,1};// int[] nums = singleNumber2(arr);// Sys原创 2020-06-10 00:52:26 · 164 阅读 · 0 评论 -
leetcode 695. 岛屿的最大面积
解题思路:递归+沉岛思想当前元素是1,如果是第一次遇到,把当前元素置为0,保证下次递归的时候不被访问。类比leetcode 200,解题思路相同 public static void main(String[] args) { int[][] grid = {{0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0},原创 2020-05-25 14:13:10 · 116 阅读 · 0 评论 -
复原IP地址
解题思路:递归加回溯 private static List<String> list = new ArrayList<>(); public static void main(String[] args) {// String s = "25525511135"; String s="010010"; restoreIpAddresses(s); System.out.println(list);原创 2020-05-22 17:26:37 · 250 阅读 · 0 评论 -
大数运算
leetcode415. 字符串相加StringBuilder sb = new StringBuilder(); int carry = 0; /** i >= 0 || j >= 0 只要有一个城里就继续,不成立的地方默认为0 继续进行加法 */ for (int i = num1.length() - 1, j = num2.length() - 1; i >= 0 || j >= 0; i--, j--) { .原创 2020-05-21 00:13:43 · 163 阅读 · 0 评论 -
14. 最长公共前缀
字符串数组的最长公共子串先计算两个字符串的最长的公共子串,然后依次遍历别的字符串数组,再计算最长的公共子串时间复杂度 O(n^2) /** * @Description: * 先计算字符串0和字符串1的公共子串,然后再与字符串2中比较如果也是,比较字符串3 * * 如果字符串发现为空 返回为空 * @Date: 2020/5/17 23:26 * @Author: fuguowen * @Return *原创 2020-05-17 23:34:38 · 158 阅读 · 0 评论 -
leetcode 108 将有序数组转换为二叉搜索树
递增的有序数组重建二叉树,结果不唯一。二分查找,使用中间的节点作为根节点,根节点左边的元素重建左子树,根节点右边的元素重建右子树。/** * 根据有序的数组递归创建二叉树,这样创建的二叉树的结果不唯一 * @param nums 有序的数组 * @Date: 2020/5/17 21:48 * @Author: fuguowen * @Return * @Throws */ public static TreeNode原创 2020-05-17 22:00:33 · 149 阅读 · 0 评论 -
leetcode 51. N皇后
解决方法:回溯算法代码:public static List<List<String>> solveNQueens(int n) { List<List<String>> list=new ArrayList<>(); int[] result=new int[n]; que...原创 2019-08-26 16:35:00 · 88 阅读 · 0 评论 -
leetcode 392. 判断子序列
解题思路:遍历子序列,如果相等,子序列和主序列都同时向后移动,如果不相等,主序列移动,子序列不移动.如果到达主序列的末尾,返回false,其他返回true.时间复杂度O(n)public static void main(String[] args) { int a[] = {1,3,4,2}; int b[] = {1,2,4,3,1,4,6,5}; ...原创 2019-02-26 14:45:32 · 1226 阅读 · 4 评论 -
leetcode 231 2的幂
2的幂解题思路是2的幂 n&(n-1)==0不是2的幂 n&(n-1) !=0代码 public static boolean isPowerOfTwo(int n) { if (n > 0) { return (n & (n - 1)) == 0; } return ...原创 2020-02-02 15:58:11 · 142 阅读 · 0 评论 -
leetcode 11. 盛最多水的容器
解题思路:1.暴力法 双层遍历 时间复杂度O(n^2) 空间复杂度O(1)2.双指针法 左右指针从两侧向中间遍历 时间复杂度O(n) 空间复杂度O(1)代码: public static void main(String[] args) { int[] arr={1,8,6,2,5,4,8,3,7}; int num = maxArea2...原创 2020-02-20 22:38:08 · 127 阅读 · 0 评论 -
leetcode 7. 整数反转
整数反转1.popint pop=x%10;x/=10;2.pushans=ans*10+pop;代码: public static void main(String[] args) { //2.147483647E9 System.out.println(Math.pow(2,31)-1); // Sy...原创 2020-02-17 15:03:26 · 170 阅读 · 0 评论 -
leetcode 3 无重复字符的最长子串
解题思路:1. 暴力法2. 滑动窗口3.对滑动窗口进行优化代码:import java.util.HashMap;import java.util.HashSet;import java.util.Map;import java.util.Set;public class Test33 { public static void main(String[] a...原创 2020-02-16 21:41:42 · 83 阅读 · 0 评论 -
leetcode 208. 实现 Trie (前缀树)
实现方式:1.一个数组2. 节点的状态标记代码:Node root; /** Initialize your data structure here. */ public Trie() { root=new Node(); } /** Inserts a word into the trie. */ public voi...原创 2020-02-14 10:18:27 · 171 阅读 · 0 评论 -
leetcode 50. Pow(x, n)
解题思路:1.使用自带的库函数2.遍历3.分治算法 递归/非递归public static void main(String[] args) { double num = myPow2(2,-2); System.out.println(num); } /** * @Description: 使用库函数 ...原创 2020-02-10 19:44:48 · 147 阅读 · 0 评论 -
leetcode 236. 二叉树的最近公共祖先
解决办法:方法一:递归遍历 节点只能在左边或者右边,left 不为空,right为空,公共祖先是left;left为空,right不为空,公共祖先是right,left和right都不为空,公共祖先是root方法二:寻找两个节点的路径,找到第一个不相等的节点,返回上一个节点代码:public static void main(String[] args) { ...原创 2020-02-09 23:18:01 · 145 阅读 · 0 评论 -
leetcode 98. 验证二叉搜索树
方法一:1.中序遍历,判断中序遍历的数组是否是升序。方法二:1.递归遍历,边界条件 判断所有左子树的节点小于根节点,所有的右子数的节点大于根节点代码:public static void main(String[] args) { TreeNode treeNode1=new TreeNode(2); TreeNode treeNode2=ne...原创 2020-02-09 18:33:56 · 155 阅读 · 0 评论 -
位运算常用的操作
1.x&1 判断是奇数还是偶数 x&1==0 是偶数 x&1==1 是奇数2.x&(x-1) 清除最低位的13.x&-x 获得最低位的1代码:public static void main(String[] args) { System.out.println(Integer.toBinaryString(11));...原创 2020-02-09 11:26:58 · 284 阅读 · 0 评论 -
leetcode 547. 朋友圈
统计朋友圈的个数方法一: 使用dfs深度优先算法使用一维数组visited 判断元素是否被使用过, 深度优先的判断条件:grid[i][j] == 1 && visited[j] == 0 没有访问过且是朋友方法二: 使用bfs广度优先算法使用一维数组visited 判断元素是否被使用过, 深度优先的判断条件:grid[i][j] == 1 &&...原创 2020-02-08 18:02:49 · 271 阅读 · 0 评论 -
leetcode 200. 岛屿数量
解决思路:1.染色从当前元素出发,向四个方向dfs 遍历,把当前位置标记为02.并查集定义并查集类,遍历二维矩阵,如果如果当前位置元素是1,遍历四个方向的元素且元素是1,执行union 操作.这里的并查集,每一次合并一个元素,count就会减1,最后的count就是岛屿的数量。并查集解决方案:代码:public class UnionFind { int[...原创 2020-02-08 11:25:54 · 105 阅读 · 0 评论 -
leetcode 72. 编辑距离
解决思路:动态规划两个核心的概念: 1.状态数组的含义 2.递归方程状态数组的含义 dp[i][j]: word1的前i个字符--->word2的前j个字符的最小步数dp[i][j]= dp[i-1][j-1] word1[i]==word2[j] min(dp...原创 2020-02-06 10:47:09 · 79 阅读 · 0 评论 -
leetcode 322. 零钱兑换
动态规划递推方程:dp[i]: 达到金钱i使用的最少的兑换次数dp[i]= min(dp[i],dp[i-coins[j]]+1) j=0...coins.lemgth代码: public static void main(String[] args) {// int[] coins = {1, 2, 5};// int amount = 1...原创 2020-02-05 20:01:18 · 125 阅读 · 0 评论 -
leetcode 121. 买卖股票的最佳时机
动态规划代码: public static void main(String[] args) { int[] prices={7,1,5,3,6,4}; int num = maxProfit(prices); System.out.println(num); } public static int maxProfit(i...原创 2020-02-04 17:58:01 · 80 阅读 · 0 评论 -
leetcode 152. 乘积最大子序列
解题思路:动态规划使用滚动数组,减少数组的开辟的空间dp[i][0]: 数组下表从0到i 使用nums[i]的乘积最大的值dp[i][1]: 数组下表从0到i 使用nums[i]的乘积最小的值为什么使用最大值和最小值?答: 因为当前元素可能为正也可能为负,如果为正,使用最大值,如果为负,使用最小值。 int x=i%2; int y=(i-1)%2; ar...原创 2020-02-04 09:18:24 · 222 阅读 · 0 评论 -
leetcode 191. 位1的个数
方法1:从右到左,以此判断每一位。是否是1,如果是累加方法2:n=n&(n-1)代码public static void main(String[] args) { int n = -100; int count = hammingWeight(n); System.out.println(count); ...原创 2020-02-02 15:35:45 · 133 阅读 · 0 评论 -
leetcode 415 字符串相加
leetcode 字符串相加解题思路:Java 类似双指针 从后向前遍历public static void main(String[] args) { String num1 = "123"; String num2 = "1234"; String s = addStrings(num1, num2); System...原创 2020-01-08 15:37:41 · 75 阅读 · 0 评论 -
leetcode Implement Queue using Stacks
Implement Queue using Stacks 题目:https://leetcode.com/problems/implement-queue-using-stacks/Implement Queue using Stacks解题思路:设有两个栈A和栈B,push:每次添加新元素时,都放入栈A中,pop:每次需要从B中取元素。一旦B栈中没有可取元素了,就将A中所有元...原创 2018-12-07 12:20:13 · 171 阅读 · 0 评论