- 博客(66)
- 收藏
- 关注
原创 LC416 分割等和子集
题目描述:class Solution { public boolean canPartition(int[] nums) {//先求和,然后分成两半// sum/2看成是一个背包,能正好装满说明可以分成两个相等的子集// 实际上也是一个动态规划的问题:背包 int sum = 0; int n = nums.length; for (int i = 0; i < n; i++) { sum += nums[
2021-09-21 00:12:09 138
原创 lc887 鸡蛋掉落
题目描述:代码如下:class Solution { HashMap<String, Integer> map; public int superEggDrop(int k, int n) { map = new HashMap<>(); //状态:当前拥有的鸡蛋,需要测试的楼层 //选择:选择去哪一层扔,循环遍历所有的选择 return dp(k,n); } int
2021-09-16 17:33:54 131
原创 kmp算法解决strStr()
题目描述:代码如下:class Solution { public int strStr(String haystack, String needle) { if (needle == null || needle.length() == 0) { return 0; } Kmp kmp = new Kmp(needle); return kmp.search(haystack); }}
2021-09-12 10:16:21 117
原创 剑指68 二叉树的最近公共祖先
题目描述:代码如下:class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if (root == null) { return null; } //判断p,q的位置 ,唯有pq结点在父节点左右两边才是最近的公共祖先 if (root.val > q.val &a
2021-09-04 16:21:41 94
原创 快排的模板(熟记!!)
代码如下: //快排切分,返回下标j,使比num[j]小的数都在j的左边,比num[j]大的数都在j的右边 private int partition(int []nums,int l,int r){int v=nums[l];int i=l;int j=r+1;while (true){ //从第二个数开始 第一个数是标志值 while (++i<=r&&nums[i]<v); //从最后一个数开始 while (
2021-09-04 16:19:47 187
原创 剑指40 最小的k个数
题目描述:代码如下:class Solution { public int[] getLeastNumbers(int[] arr, int k){if(arr.length==0||k==0){ return new int[]{};}//k-1下标return quickSort(arr,0,arr.length-1,k-1); } private int[] quickSort(int []nums,int l,int r,int k){
2021-09-04 16:00:56 68
原创 剑指35 复杂链表的复制
题目描述:思路:利用哈希表的查询特点,考虑构建原链表节点和新链表对应节点的键值对映射关系,再遍历构建新链表各节点的next和random引用指向即可。代码如下:class Solution { public Node copyRandomList(Node head) { if(head==null){ return null; } Node cur=head; HashMap&l...
2021-09-04 15:21:09 62
原创 剑指16 数值的整数次方
题目描述:代码如下:class Solution { public double myPow(double x, int n) { //3^10 -> 9^5 //3^11 -> 3*9^5 if(n==0){ return 1; } if(n<0){ return myPow(1/x,-n-1)*1/x;//防止数字溢出
2021-09-04 14:47:56 69
原创 剑指54 二叉搜索树的第k大节点
题目描述:思路:二叉树的中序遍历,输出的结果是递增的,所以我们只要反序中序遍历就可以了,然后取第k个值就是第k大的节点,比如上面中序遍历完是1234,反序就是4321,取第一个就是4了。代码如下:class Solution { int res; int k; public int kthLargest(TreeNode root, int k) { this.k=k;reverse(root);return res; } void
2021-09-03 00:29:53 60
原创 剑指14 剪绳子
题目描述:代码如下:class Solution { //dp[i]表示长度为i的绳子得到的最大乘积 public int cuttingRope(int n) { //长度为n int dp[] = new int[n+1]; // 长度最短都为1,初始化 Arrays.fill(dp, 1); dp[2]=1; for (int i = 3; i <n+1 ; i++) {.
2021-08-30 00:26:14 53
原创 剑指26 树的zi结构
题目描述:代码如下:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { public boolean isSubStructure(TreeNode A, T
2021-08-29 23:39:27 68
原创 剑指21 调整数组顺序使得奇数位于偶数前面
题目描述:代码如下:class Solution { public int[] exchange(int[] nums) {//快慢指针 同一起跑线 快指针是奇数就交换到前面 int left=0; int right=0;while (right<nums.length){ if(nums[right]%2!=0){ int temp=nums[left]; nums[left++]=nums[right]; .
2021-08-16 00:14:33 52
原创 剑指07 重建二叉树
题目描述:代码如下:class Solution { int [] preorder;//用来传参 HashMap<Integer, Integer> map = new HashMap<>(); public TreeNode buildTree(int[] preorder, int[] inorder) { this.preorder=preorder; for (int i = 0; i < inorder.l
2021-08-15 23:41:08 86
原创 剑指12 矩阵中的路径
题目描述:代码如下:class Solution { public boolean exist(char[][] board, String word) {//只有四个方向 建立方向数组 int x[]=new int[]{0,0,-1,1};//横向 int y[]=new int[]{-1,1,0,0};//纵向 //分别对应 上 下 左 右 for (int i = 0; i < board.l
2021-08-14 23:00:40 56
原创 剑指25 合并两个有序链表
题目描述:代码如下:迭代class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) {ListNode newhead=new ListNode(0); ListNode curr=newhead; while (l1!=null&&l2!=null){ if(l1.val<l2.val){ c
2021-07-22 01:23:07 69
原创 剑指11 旋转数组的最小数字
题目描述:代码如下:class Solution { public int minArray(int[] numbers) { int left=0; int right=numbers.length-1;while (left<right){//注意细节int mid=left+(right-left)/2;if(numbers[mid]>numbers[right]){ left=mid+1;}else if(number
2021-07-22 00:26:26 63
原创 剑指09 用两个栈实现队列
题目描述:思路:调用add方法时加入一个栈中。调用del方法时,先判断第二个栈是否为空,若为空,则将第一个栈的全部元素退出并加入到第二个栈中,实现队列的先入先出功能。代码如下:class CQueue { LinkedList<Integer> stack1; LinkedList<Integer> stack2; public CQueue() {//初始化两个栈 stack1=new LinkedList<>();
2021-07-21 23:21:02 60
原创 LC96 不同的二叉搜索树
题目描述:代码如下:class Solution { HashMap<Integer,Integer> map=new HashMap<>();//备忘录 public int numTrees(int n) { return dfs(n); } int dfs(int n){ if(n<=1){ return 1; } if(map.cont
2021-07-21 00:24:26 62
原创 LC450 删除二叉搜索树中的节点
题目描述:代码如下:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, Tre
2021-07-21 00:02:09 71
原创 LC701 二叉搜索树中的插入操作
题目描述:代码如下:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, Tre
2021-07-20 23:22:10 74
原创 LC700 二叉搜索树中的搜索
题目描述:代码如下:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, Tre
2021-07-20 23:07:45 55
原创 LC110 平衡二叉树
题目描述:代码如下:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, Tre
2021-07-16 00:08:56 112
原创 LC 将有序数组转换为二叉搜索树
题目描述:思路:数组是有序的,我们选数组中间的数字作为中间结点,两边各取中间分别作为该根节点的左、右结点,如此递归下去。代码如下:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this..
2021-07-15 00:51:43 50
原创 LC 对称二叉树
题目描述:代码如下:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, Tre
2021-07-15 00:15:58 71
原创 LC 验证二叉搜索树
题目描述:代码如下:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, Tr.
2021-07-14 23:30:58 54
原创 LC 二叉树的最大深度
题目描述:代码如下:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, Tre
2021-07-14 22:53:05 58
原创 LC1143 最长公共子序列
题目描述:代码如下:动态规划class Solution { public int longestCommonSubsequence(String text1, String text2) { int m=text1.length(); int n=text2.length();int dp[][]=new int[m+1][n+1];ini(dp,m,n);//初始化dp//dp[i][j]相当于长度为i的text1与长度为j的text2 的最长
2021-07-14 00:19:14 121
原创 剑指42 连续子数组的最大和
题目描述:代码如下:class Solution { public int maxSubArray(int[] nums) { if(nums==null||nums.length==0){ return 0; }int length=nums.length;int dp[]=new int[length];//dp[i]相当于以nums[i]为结尾的字数组的最大和dp[0]=nums[0];for( int i=1;i&
2021-07-13 22:53:13 56
原创 LC354 俄罗斯套娃信封问题
题目描述:代码如下:class Solution { public int maxEnvelopes(int[][] envelopes) {//[w][h] 处理,对w升序,对h降序 因为对于相同w只能放入一个 相当于一个一维的最长子序列 Arrays.sort(envelopes, new Comparator<int[]>() { @Override public int compare(int[] o1, .
2021-07-13 22:22:51 83
原创 LC300 最长递增子序列
题目描述:代码如下:class Solution { public int lengthOfLIS(int[] nums) {int leng=nums.length;int dp[]=new int[leng];for(int index=0;index<leng;index++){//初始化dp数组 dp[index]=1;}//dp[i]表示nums[i]中的到这个数字的最长递增序列for(int i=0;i<leng;i++){ for(
2021-07-13 21:45:44 64
原创 LC3 无重复字符的最长字串
题目描述:代码如下:要注意记录长度的阶段!class Solution { public int lengthOfLongestSubstring(String s) { HashMap<Character, Integer> window = new HashMap<>(); int left=0,right=0; int length=Integer.MIN_VALUE; while (right
2021-07-13 01:34:44 85
原创 LC438 找到字符串中所有字母异位词
题目描述:代码如下:class Solution { public List<Integer> findAnagrams(String s, String p) { LinkedList<Integer> res = new LinkedList<>(); HashMap<Character, Integer> need = new HashMap<>(),window= new HashMap
2021-07-13 01:10:11 95
原创 LC567 字符串的排列
题目描述:代码如下:注意四个条件:窗口右移的时候需要更新什么?什么时候需要进行窗口左移?窗口左移的时候需要更新什么? 输出结果是在右移阶段还是左移阶段?class Solution { public boolean checkInclusion(String s1, String s2) { HashMap<Character, Integer> window =new HashMap<>(),need = new HashMap<>().
2021-07-13 00:35:25 85
原创 LC752 打开转盘锁
题目描述:方法:bfs广度遍历class Solution { public int openLock(String[] deadends, String target) { Queue<String> queue = new LinkedList<String>();//主动队列 Set<String> visited=new HashSet<>(); Set<String&.
2021-07-12 00:29:31 86
原创 LC51 N皇后问题
题目描述:代码如下:class Solution { List<List<String>> res=new ArrayList<>(); public List<List<String>> solveNQueens(int n) { char chessboard[][]=new char[n][n]; for(int i=0;i<n;i++){ Arrays.fill(ches
2021-07-11 22:10:45 69
原创 LC46 全排序
题目描述:代码如下:class Solution { List<List<Integer>> res=new LinkedList<List<Integer>>(); public List<List<Integer>> permute(int[] nums) { LinkedList<Integer> track=new LinkedList<Integer>();backt
2021-07-11 18:17:27 74
原创 LC322 零钱兑换
题目描述:使用动态规划解决:方法一:自顶向下(递归备忘录)class Solution { public int coinChange(int[] coins, int amount) { int def[]=new int[amount+1]; //备忘录数组 数组长度为amount+1 //目的是为了记录每一个目标为amount所用硬币的最优解 return dp(c.
2021-07-11 00:53:58 72
原创 LC 92反转链表Ⅱ
题目描述:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next;
2021-07-08 00:32:17 144
原创 LC124 二叉树中的最大路径和
题目描述:实际上是二叉树的后序遍历。代码如下:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeN
2021-07-07 23:50:32 90
原创 LC 215 数组中的第k个最大元素
题目描述:代码如下:快排class Solution { public int findKthLargest(int[] nums, int k) {int len=nums.length;int left=0;int right=len-1;int target=len-k;while(true){ int partition=partition(nums,left,right); if(target==partition){ return n
2021-07-07 23:10:44 78
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人