leecode
ohh`
这个作者很懒,什么都没留下…
展开
-
LeeCode437路径总和Ⅲ(Java)(前缀和+递归)
题目链接:LeeCode437路径总和Ⅲ题目描述:原文地址这个题是看题解大佬才学会的,本来想dfs硬搜,但是感觉不太能实现,之后看完正好用前缀和,hashmap存下来,class Solution { static Map<Integer,Integer> map; static int target; public static int pathSum(TreeNode root, int sum) { map=new HashMap&原创 2021-03-10 17:12:21 · 166 阅读 · 0 评论 -
LeeCode739每日温度(Java)(单调栈)
题目链接:LeeCode739每日温度题目描述:单调栈,先将温度下标压到栈里面,有比该温度大的温度时将数据弹出栈,记录相差天数public static int[] dailyTemperatures(int[] T) { Stack<Integer> stack=new Stack<>(); int[] ans=new int[T.length]; for (int i = 0; i < T.length; i++) {原创 2021-03-09 22:18:49 · 146 阅读 · 0 评论 -
LeeCode621任务调度器(Java)(填桶思想)
题目链接:LeeCode621任务调度器题目描述:开始想模拟一下任务调度,后来发现不是最优解,想了想最优解应该是先执行最多的任务,依次向最少的任务执行,例如:AAABBBCCCDDE执行顺序应该是ABCDABCDABCE等于12,最开始思路想错了写成了ABCABCABCDE空闲D等于13然后又在题解学了填桶的思想,大神的题解受益匪浅,就是用表格将最多的任务放在前面,作每行的头,之后将较少的任务填满该行,最后的格子数就是最优解,但是有一种情况就是种类过多,表格会变得不规律,无法计算正确答案,可以比限原创 2021-03-09 22:14:30 · 160 阅读 · 0 评论 -
LeeCode581最短无序连续子数组(Java)(单调栈或简单排序)
题目链接:LeeCode581最短无序连续子数组题目描述:拿到题秒出思路排序找对应位置不匹配的数组例:2,6,4,8,10,9,15排序过后:2,4,6,8,9,10,15不对应的位置就是4-9的长度得出5代码:class Solution { public static int findUnsortedSubarray(int[] nums) { if(nums.length==1||nums.length==0)return 0; int[] nums原创 2021-03-09 12:45:30 · 135 阅读 · 0 评论 -
LeeCode560和为k的子数组(Java)(前缀和)
题目链接:LeeCode560和为k的子数组题目描述:这道题最开始想用滑窗做,但是后来考虑数组里面是有负数的,方向是出错的,首先考虑最笨的放法就是遍历一遍确定左边界,然后向后计算是否有结果等于k的子数组。时间复杂度O(n*n),然后考虑前缀和,算出所有的前缀和例如1 1 1 1 1 k=3,前缀和为1 2 3 4 5 结果等于3的子数组就是 4-1,5-2,3-0三种情况。得出代码:class Solution { public static int subarraySum(int[] num原创 2021-03-09 12:38:48 · 165 阅读 · 0 评论 -
LeeCode494目标和(Java)(dfs)
题目链接:LeeCode494目标和题目描述:这个题上来看一眼就是动态规划,然后说实话我也是到现在也没学会,学会了会去更新,暴力做法相信大家都能想到,数据比较小。class Solution { public static int findTargetSumWays(int[] nums, int S) { return dfs(nums,S,0); } public static int dfs(int[] nums,int S,int step){原创 2021-02-20 18:28:38 · 111 阅读 · 0 评论 -
LeeCode543二叉树的直径(Java)(递归)
题目链接:LeeCode543二叉树的直径题目描述:求树中两个节点最远的距离,不一定过根节点,我直接想的思路就是通过最大深度,某个点左右子树最大深度和肯定有最远的,然后思路对了就开写,真是过年过傻了,竟然将节点遍历出来再挨个求深度,最后想到可以求深度的过程中解决问题/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNo原创 2021-02-20 18:25:00 · 181 阅读 · 0 评论 -
LeeCode697数组的度(Java)(哈希)(每日签到)
题目链接:LeeCode697数组的度题目描述:题目有点绕嘴就是说求出数组的最大度,度就是数组最多拥有多少个相同的数,然后让子序列在保证度相同的同时尽可能短。思路非常简单,我使用了一个hashmap,每个键对应一个长度为3的数组,degree[0]存度,degree[1]存该数在序列中起点,degree[2]则存终点。然后找出最大度里面起点和终点差最小的,效率还是蛮高得class Solution { public static int findShortestSubArray(int[]原创 2021-02-20 16:57:20 · 89 阅读 · 0 评论 -
LeeCode461汉明距离(Java)(动态规划)
题目链接:LeeCode461汉明距离题目描述:题目很简单,就是算二进制位置不同的数有几个,可以异或一下,异或的意思就是将1变成0001,将4变成0100然后相同为0不同为1,得出0101即5,再算5的二进制1有几个class Solution { public int hammingDistance(int x, int y) { int z=x^y,ans=0; while(z>0){ if(z%2==1)ans++;原创 2021-02-20 12:59:54 · 103 阅读 · 0 评论 -
LeeCode438找到字符串中所有字母异位词(Java)(hash哈希)
题目链接:LeeCode438找到字符串中所有字母异位词题目描述:找字母异位词就是相同字母组成但是顺序不一样的词,自己写一个哈希,越散列越好,判断是否是字母异位词class Solution { public List<Integer> findAnagrams(String s, String p) { List<Integer> list=new ArrayList<>(); //p串算出来的hash in原创 2021-02-19 18:40:48 · 156 阅读 · 0 评论 -
LeeCode416分割等和子集(Java)(动态规划)
题目链接:LeeCode416分割等和子集题目描述:首先看要求,判断是否能分成两个和相等的子集,于是我就想求出整个和的一半,然后搜索判断是不是能拼出来这样的结果,然后时间超限了。然后就开始思考动态规划,把这个题看成0-1背包问题,当容量是整个和一半的时候能获得的价值也是和一半代表拼出来了,返回trueclass Solution { public static boolean canPartition(int[] nums) { int[] dp=new int[20000]原创 2021-02-19 17:07:54 · 202 阅读 · 0 评论 -
LeeCode406根据身高重建队列(Java)(贪心带点脑筋急转弯)
题目链接:根据身高重建队列题目描述:首先拿到问题考虑应该如何排序,后面的人只能看见前面一边高的和一样高的,所以应该让高的先入队,然后矮的入队的时候直接根据后面的位置直接入队即可,因为前面入队的都比这个人高,所以答案可以保证正确。class Solution { public static int[][] reconstructQueue(int[][] people) { Arrays.sort(people, new Comparator<int[]>() {原创 2021-02-19 15:24:59 · 103 阅读 · 0 评论 -
LeeCode394字符串解码(Java)(递归)
题目链接:LeeCode394字符串解码题目描述:年前开的这个题,然后写了两发,没过,就去奶奶家过年了,吃年夜饭都在想,回家迫不及待就给写了,简单递归,想好入口出口,各种情况考虑清楚就ok了,唯一注意的地方就是用string拼接会比stringbuilder慢很多class Solution { public static String decodeString(String s) { return dfs(s, 0)[0]; } public static S原创 2021-02-19 11:23:09 · 184 阅读 · 0 评论 -
LeeCode347前k个高频元素(Java)(最小堆/优先队列)
题目链接:LeeCode347前k个高频元素题目描述:优先队列维护小根堆,每次有比队首大的就弹出队首然后入队class Solution { public static int[] topKFrequent(int[] nums, int k) { int[] frequent=new int[k]; Map<Integer,Integer> map=new HashMap<>(); //小根堆,即按比较器中内容升序排列,原创 2021-02-06 14:45:27 · 152 阅读 · 0 评论 -
LeeCode338比特位计数(Java)(动态规划)
题目链接:LeeCode338比特位计数题目描述:根据二进制数的性质,1,2,4,8…都只有一个1后面的可能是往上加或者加这些是1的数,取小值就行public int[] countBits(int num) { if(num==0)return new int[]{0}; if(num==1)return new int[]{0,1}; int n=1; int[] dp=new int[num+1]; dp[0]=0;原创 2021-02-05 20:21:12 · 109 阅读 · 0 评论 -
LeeCode213打家劫舍Ⅲ(Java)(树状动态规划)
题目链接:LeeCode213打家劫舍Ⅲ题目描述:这题看了Leetcode大神liweiwei1419的题解,感觉自己还是太菜了,其实这题原理跟打家劫舍Ⅰ,Ⅱ是一模一样的,但是可能由于我对树的理解有点浅,所以自己写了一个没跑过去。然后说说这题的思路思路新了解一个词叫后效性,虽然已经做了好几个类似的题了,我竟然也是看了题解才知道股票类型的题和这个还有打家劫舍都是一种题型。那下面说一下什么叫后效性。后效性:我理解的后效性就是当前状态会影响之后的状态,使得后面的状态不确定所以一般有后效性的题都要原创 2021-02-05 18:59:41 · 148 阅读 · 0 评论 -
LeeCode213打家劫舍Ⅱ(Java)(dp动态规划)
题目链接:LeeCode213打家劫舍Ⅱ题目描述:根据Leetcode198打家劫舍的思路多一个限制就是用1不能用n,用n不能用1,所以开了两个数组,一个存除了1的最大值,一个存除了n的最大值class Solution { public static int rob(int[] nums) { if(nums.length==1)return nums[0]; if(nums.length==2)return Math.max(nums[0], nums[1]原创 2021-02-05 15:57:32 · 142 阅读 · 0 评论 -
LeeCode309买卖股票的最佳时机(Java)(dp状态机)
题目链接:LeeCode309买卖股票的最佳时机题目描述:这个题真的卡了我好久,之前没做过类似的题目,看了题解才知道有状态机这个概念,得考虑多个状态,然后说说解题思路:思路买卖股票过程中一定会有两种状态,现在 手里面有股票/手里面没股票当手里面有股票时,有两种情况1.手里得股票是今天买的,那当前利润就是前天(今天减两天,因为有冷冻期)卖的最大利润减今天买股票花费的钱。2.手里的股票是昨天就有的,至于到底什么时候买的无所谓,当前利润就是昨天时候的利润当手里面没股票时,也有两种情况1.今天把股原创 2021-02-05 13:49:53 · 149 阅读 · 0 评论 -
LeeCode448找到所有数组中消失的数字(Java)(思维)
题目链接:LeeCode448找到所有数组中消失的数字题目描述:遍历一遍原始数组,每一个num[num[i]]变成负数,缺失的下标位置则不会变成负数,所以就可以找出来了class Solution { public List<Integer> findDisappearedNumbers(int[] nums) { List<Integer> list=new ArrayList<>(); for (int i = 0; i原创 2021-02-03 23:12:21 · 102 阅读 · 0 评论 -
LeeCode322零钱兑换(Java)(完全背包)
题目链接:LeeCode322零钱兑换题目描述:完全背包换成贪心小的,直接写就行class Solution { public static int coinChange(int[] coins, int amount) { int[] dp=new int[amount+1]; Arrays.fill(dp,Integer.MAX_VALUE-100); dp[0]=0; for (int i = 0; i < coins原创 2021-02-03 20:43:10 · 170 阅读 · 2 评论 -
LeeCode300最长递增子序列(Java)(动态规划加二分)
题目链接:LeeCode300最长递增子序列题目描述:首先拿到手就是一发动态规划LIS裸体,直接秒class Solution { public static int lengthOfLIS(int[] nums) { int[] dp=new int[nums.length]; int max=Integer.MIN_VALUE; for (int i = 0; i < nums.length; i++) { fo原创 2021-02-03 16:08:09 · 178 阅读 · 0 评论 -
LeeCode287寻找重复数(Java)(二分)
题目链接:LeeCode287寻找重复数题目描述:题目说数字都在1-n之间所以可以在脑袋里面想象一个有序的1-n,其中有一个数是重复的,所以可以二分脑子里面有序的这个序列例:1,2,2,3,4,5,6,7,8这个序列,开始mid=(0+8)/2=4,注意是mid=4不是nums[mid]=4如果当前数组里面所有小于等于4的数大于四个,代表答案在1,2,3,4里面,注意这个1,2,3,4不是nums里面的,是脑子里面的依次类推,找到最后就是答案class Solution { public原创 2021-02-02 23:13:33 · 73 阅读 · 0 评论 -
LeeCode283移动零(Java)(双指针)
题目链接:LeeCode283移动零题目描述:双指针,左指针一步一步走,每次左指针遇见0就用右指针找第一个不等于零的数换过来,然后左指针接着往下找class Solution { public void moveZeroes(int[] nums) { //初始化左右指针 int l=0,r=1; while(l< nums.length){ //当左指针遇见零 if(nums[l]==0){原创 2021-02-02 21:40:11 · 84 阅读 · 0 评论 -
LeeCode279完全平方数(Java)(完全背包)
题目链接:LeeCode279完全平方数题目描述:将平方小于n的平方数存起来,然后相当于背包里面的重量,价值相当于1,每次取小的价值,背包有不懂的可以去看背包问题详解class Solution { public static int numSquares(int n) { int[] dp=new int[n+1]; Arrays.fill(dp,Integer.MAX_VALUE-10); int cnt= (int) Math.sqrt(原创 2021-02-02 21:29:49 · 148 阅读 · 0 评论 -
LeeCode240搜索二维矩阵(Java)(二分/思维)
题目链接:LeeCode240搜索二维矩阵题目描述:这题是我一生之敌,上来想都没想我就开始深搜,深搜发现不行,我这聪明的小脑袋瓜直接就开始广搜,全t了,然后暴力遍历了一遍数组,过了。。。然后就想硬遍历都能过那就加个二分,对每层二分,有两点不用进行二分1.当前行最后一个数小于target2.当前行第一个数大于target于是就有了第一个写法class Solution { public static boolean searchMatrix(int[][] matrix, int targ原创 2021-02-01 21:42:06 · 127 阅读 · 0 评论 -
LeeCode238除自身以外数组的乘积(Java)(思维)
题目链接:LeeCode238除自身以外数组的乘积题目描述:这道题属实没想到进阶的解法,看了题解才会的,定义一个常数先从左向右将答案数组都存当前数左边的乘积,然后反向遍历,用常数存当前数右边的乘积,再和刚才存下来的左边数的乘积相乘public static int[] productExceptSelf(int[] nums) { int k=1; int[] ans=new int[nums.length]; ans[0]=1; fo原创 2021-02-01 18:08:39 · 94 阅读 · 2 评论 -
LeeCode236二叉树的最近公共祖先(Java)(LCA,递归)
题目链接:LeeCode236二叉树的最近公共祖先题目描述:起初是自己想了一个思路,将树的前序遍历存到list里,每次查p,q在左子树区间还是右子树区间,如果都在左或者都在右,那就将这个区间放进去接着找,如果一左一右,那就返回当前节点,这是我自己的代码,时间300+ms,太low了/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; *原创 2021-02-01 15:52:16 · 146 阅读 · 0 评论 -
LeeCode234回文链表(Java)(快慢指针,边遍历边反转)
题目链接:LeeCode234回文链表题目描述:拿到这道题首先想到的是找中间节点,所以肯定是用快慢指针,然后应该把前面或者后面倒叙再去比。就想到反转链表这个题,进阶要求说是空间复杂度O(1)所以不能用栈,于是重新想了一下反转链表的做法,这里也是看了一个大神的思路,自己说实话也是半天没绕过来,取自leetcode题解某大神的图,设置两个指针一边遍历一边将指针反过来,于是反转链表的写法就如下/** * Definition for singly-linked list. * public clas原创 2021-01-31 19:29:10 · 127 阅读 · 0 评论 -
LeeCode226翻转二叉树(Java)(前序遍历)
题目链接:LeeCode226翻转二叉树题目描述:边先序遍历边构建一个反转的二叉树class Solution { public static TreeNode invertTree(TreeNode root) { if(root==null)return null; Queue<TreeNode> queue=new LinkedList<>(); Queue<TreeNode> newqueue=new Li原创 2021-01-31 16:41:48 · 121 阅读 · 0 评论 -
LeeCode221最大正方形(Java)(动态规划)
题目链接:LeeCode221最大正方形题目描述:动态规划如上图第一个样例,下图是dp数组只要维护这几点就好:1.如果当前不是1,无需考虑,如果是1看他得左,上,斜上是不是12.如果左,上,斜上都是1,那么应该考虑,拼到这的时候,前面已经拼好的正方形有多大,当前值等于已经拼好得加一3.如果出现像下图数组dp[2][4]的情况,当前dp值应该是多少,答案是比较小的数加一class Solution { public int maximalSquare(char[][] matrix)原创 2021-01-31 15:03:11 · 114 阅读 · 0 评论 -
LeeCode215数组中的第k个最大元素(Java)(快排思想,优先队列,归并排序,分治)
题目链接:LeeCode215数组中的第k个最大元素题目描述:这个题我必须吐槽一下,我拿到手看题目,不知道是我理解问题还是怎么的,我就感觉他是不让排序然后做出来,我整整想了两个小时,凑了一个,你没听错就是凑,凑一个不用动数组的方法,结果一运行要我半条命,代码我贴出来留念,千万别学这种class Solution { public static int findKthLargest(int[] nums, int k) { List<Integer> small=ne原创 2021-01-31 14:22:20 · 197 阅读 · 0 评论 -
LeeCode207课程表(Java)(图的拓扑排序)
题目链接:LeeCode207课程表题目描述:这道题就是拓扑排序模板题,不用多说,如果不知道什么叫拓扑排序可以看拓扑排序这篇文章。class Solution { public static boolean canFinish(int numCourses, int[][] prerequisites) { if(prerequisites.length==0||prerequisites.length==1)return true; int[][] edges原创 2021-01-30 20:20:52 · 219 阅读 · 0 评论 -
LeeCode200岛屿数量(Java)(dfs)
题目链接:LeeCode200岛屿数量题目描述:遍历整个数组,每次遍历到的时候进入深搜,把所有上下左右连着的1都变成0,遍历数组时进入几次就是几个岛屿class Solution { int[][] dir=new int[][]{{1,0},{-1,0},{0,1},{0,-1}}; public int numIslands(char[][] grid) { int ans=0; int[][] book=new int[grid.length][g原创 2021-01-28 18:11:01 · 150 阅读 · 0 评论 -
LeeCode198打家劫舍(Java)(动态规划dp)
题目链接:LeeCode198打家劫舍题目描述:经典动态规划,房屋数在3以内时,所获得的最大利益一定是nums[0]+nums[2]或nums[1],而nums[3]时能获得的最大利益一定是nums[0]时获得的最大利益加本身或者nums[1]时获得的最大利益加本身,因为小偷肯定一次跑2步或者跑3步,跑4步会变成两个2步会漏掉中间的。状态转移方程:dp[i]=Math.max(dp[i-2],dp[i-3])+nums[i];class Solution { public static in原创 2021-01-28 16:03:07 · 175 阅读 · 0 评论 -
LeeCode169多数元素(Java)(排序加简单思维)
题目链接:LeeCode169多数元素题目描述:先排序,设置三个指针,一个指向当前出现数最多的数,一个记录当前数出现次数,一个记录出现最多出现数得次数。每次遍历到不同元素时候更新一次三个指针代表的数。class Solution { public static int majorityElement(int[] nums) { if(nums.length==0)return 0; if(nums.length==1)return nums[0];原创 2021-01-28 15:54:07 · 109 阅读 · 0 评论 -
LeeCode206反转链表(Java)(递归和迭代)
题目链接:LeeCode206反转链表题目描述:递归:递归到最底层,再往回拼,很简单/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode nex原创 2021-01-28 12:58:52 · 134 阅读 · 0 评论 -
LeeCode148相交链表(Java)(快慢指针或哈希)
题目链接:LeeCode148相交链表题目描述:快慢指针:计算两个数组的长度差,然后将较长数组的指针移动到与较短数组相等,然后一起走,相等时即为相交节点/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null;原创 2021-01-27 20:57:55 · 124 阅读 · 0 评论 -
LeeCode148排序链表(Java)(单链表的归并排序)
题目链接:LeeCode148排序链表题目描述:看题目就知道是要归并排序,然后复习了归并排序的知识,用链表实现归并还是有点绕,还是看了题解才做出来,不过跟跟数组归并的思路是一样的,就不多阐述了class Solution { //递归函数,用来将链表不断的分成两个再有序合并 public static ListNode sortList(ListNode head) { if (head == null || head.next == null) {原创 2021-01-27 17:57:55 · 193 阅读 · 0 评论 -
LeeCode136只出现一次的数字(Java)(异或和数组)
题目链接:LeeCode136只出现一次的数字题目描述:我自己想的方法是排序挨个找,如果当前的跟上一个元素相等那就将flag置成true,当flag为true时即使不相等也能往前走,找到既不和前一个元素相等flag又为false的点就是单独元素class Solution { public int singleNumber(int[] nums) { Arrays.sort(nums); boolean flag=false; int index原创 2021-01-23 22:33:37 · 344 阅读 · 0 评论 -
LeeCode142环形链表Ⅱ(Java)(快慢指针和hash哈希两种做法)
题目链接:LeeCode142环形链表Ⅱ题目描述:刚做完leetcode141就做这个了,所以对大体思路也都差不多,先写了一个哈希看看能不能过,过是过了但是打败了5%的提交有点太low了,而且题目说要求空间o(1)做/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x;原创 2021-01-23 21:48:08 · 148 阅读 · 0 评论