算法
leetcode做题记录和一些算法题
木子六日
好好学习天天向上
展开
-
Leetcode每日随机2021/5/17
题思第一题其实就是算一下奇数偶数第二题原来做过,看了下是用BFS做的。今天用dp做的。第三题跟两数之和一样的思路,无非就是求两数之积等于目标数。代码第一题class Solution { public int minCostToMoveChips(int[] position) { Set<Integer> set = new HashSet<Integer>(); for (int i = 0; i < position.leng原创 2021-05-17 16:33:04 · 368 阅读 · 2 评论 -
Leetcode每日随机2021/5/16
题思第一题统计加排序第二题暴力dfs+去重第三题没做出来代码第一题class Solution { public int[] frequencySort(int[] nums) { Map<Integer, Integer> map = new HashMap<Integer, Integer>(); for (int i = 0; i < nums.length; i++) { map.put(nums[i], map.getO原创 2021-05-16 17:53:50 · 246 阅读 · 0 评论 -
Leetcode每日随机20201/5/15
题思第一题弱智题第二题答案看起来费劲,我知道我做不出来的。第三题公式找出来就好做了,(2n)!/2n代码第一题/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.va原创 2021-05-15 17:01:03 · 235 阅读 · 0 评论 -
Leetcode每日随机2021/5/14
题做不出来思第一题不说了第二题做不出来第三题做不出来代码第一题class Solution { public int findKthLargest(int[] nums, int k) { Arrays.sort(nums); return nums[nums.length - k]; }}后面两题答案都看不明白,就不挂代码了。...原创 2021-05-14 16:35:30 · 123 阅读 · 0 评论 -
Leetcode每日随机2021/5/13
题没有难度。思第一题简单递归第二题调一下API将int转为二进制字符串:Integer.toBinaryString(n)将二进制字符串转化为整形:Integer.parseUnsignedInt(binaryStr,2)第三题把长度为combinationLength的子序列都用dfs求一遍就行了代码第一题/** * Definition for a binary tree node. * public class TreeNode { * int val;原创 2021-05-13 16:30:36 · 126 阅读 · 0 评论 -
Leetcode每日随机2021/5/12
题今天的题比较简单。思今天的代码的效率还可以。第一题dfs找一下求一下目标节点的深度和父亲,然后两个目标节点的深度一样,父亲不一样就说明是堂兄弟节点。第二题从大到小加过去就行了。第三题以前做过,也没啥好说的,这题挺没意思的,写起来麻烦一些,模拟就行了。代码第一题/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left;原创 2021-05-12 16:24:55 · 106 阅读 · 0 评论 -
Leetcode每日随机2021/5/11
题今天的题比较简单。思第一题dfs第二题我习惯把图换成邻接矩阵来做,这题也就是照着做就行了第三题经典题了,两轮异或。代码第一题class Solution { private int count = 0; public int findTargetSumWays(int[] nums, int target) { dfs(nums, 0, 0, target); return count; } private void dfs(int[]原创 2021-05-11 15:48:13 · 104 阅读 · 0 评论 -
Leetcode每日随机2021/5/10
题思心乱了第一题一看就是弗洛伊德。固定模板,先转成邻接矩阵,自己到自己设为0,不可直达的边设为Integer.MAX_VALUE.复制一遍这个邻接矩阵记作floyd矩阵,三重循环k,i,j。temp = floyd[i][k] + floyd[k][j],如果ik和kj中有不可达的路径,temp仍为不可达。否则若temp<floyd[i][j],更新floyd[i][j]为temp。第二题以前做过。第三题没做出来也没时间做了。dp[i]表示前i个字符能拆成什么几种情原创 2021-05-10 18:53:40 · 133 阅读 · 0 评论 -
Leetcode每日随机2021/5/9
题今天的题计较简单,一个小时AC了。思第一题哈希表存下每个字符出现的索引,重复直接设置成一个特殊值。拿到map的所有value,取除去特殊值外的最小值。第二题这题我的思路比较奇葩。先随便构造一个数组满足要求就行,只要这一段整数的范围是连续的。最后把这一段整数平移到0~N。第三题我直接换成字符串然后做排序再转回Integer,有点赖皮。。。代码第一题class Solution { public int firstUniqChar(String s) { Map<原创 2021-05-09 21:55:22 · 109 阅读 · 0 评论 -
Leetcode每日随机2021/5/8
题今天状态很不好。思这一个礼拜过得真快,仿佛才刚回来又要回去了我的心越来越软了我很害怕第一题傻逼题,空间O(1)那个是人能想出来的?第二题这题真不该花那么多时间,代码里有错误没检查出来,说白了就是从0开始,把跟0相关的都转成由0作为起始点的,然后依次遍历就行了。可是我在写dfs的时候出现了一个很傻逼的错误,最后才发现,搞得我写最后一题的时候只剩十几分钟了。第三题我看答案居然还看了半天,就是记录一下当前节点和走到他的边,左用false表示,右用true表示。dfs遍历一下原创 2021-05-08 22:52:23 · 154 阅读 · 0 评论 -
Leetcode每日随机2021/5/7
题还行吧,困难那题确实做不出来思第一题按照第二个数从小到大排个序就行了。第二题贪心,优先拿两人都觉得值钱的(alice[i]+bob[i]最大的)。以前做过,我这次的代码还是比以前的好一点,空间好一点。第三题看了答案感觉不是很难,没想出来有点可惜。先按任务结束时间排个序。然后找到每一个任务之前的那个任务(可被执行的最近的任务)用数组pre存储。dp[i] = Math.max(dp[i-1],dp[pre[i]]+profit[i])可惜代码第一题class Sol原创 2021-05-07 21:32:40 · 163 阅读 · 0 评论 -
Leetcode每日随机2021/5/6
题今天又AC了,这三题以前好像都做过。思今天是经典专场啊。第一题leetcode第二题,看了下我一年多前的代码,跟现在的真比不了,写的太臭了,今天写的就很简洁。第二题这题是给我印象很深的一题,这题我也做过,可以说是我第一次碰到要用堆来解决的问题。第三题这题也是老经典了,就是一个普通的dfs,做下判重和剪枝就能过,为了剪枝多减一点,最好排下序,从大到小依次添加。代码第一题/** * Definition for singly-linked list. * public原创 2021-05-06 21:14:36 · 195 阅读 · 1 评论 -
Leetcode每日随机2021/5/5
题思今天可以说做的很烂了,只做了第三题。。。第一题我一看是图的题,就不想做了,直接跳过,最后一看答案,果然现在的我是做不出来的;并查集,等回学校花时间了解一下吧;第二题我以为第二题又是脑瘫题,这不就一个大根堆的事么,结果超时,大部分时间都在做这题,真的恶心。其实后来差不多有算差值这个思路了,但是模拟不出来啊,难受,看了下别人的题解,果然都是又臭又长的,真烦诶;第三题以前做过,就是一个贪心。我看了下以前的代码,以前的我和现在的我思路差不多,都是先排序,再用二分。代码第一题原创 2021-05-05 22:03:06 · 125 阅读 · 0 评论 -
Leetcode每日随机2021/5/4
题哈哈今天AC了。思对今天的代码还是比较满意的。第一题这两个操作让人自然而然想到了二进制。将0变为指定数,如果将指定数看成二进制,那么这两个操作不就是左移一位和把一个0变成1么。所以将0变为指定数的最少操作数就是左移的次数+变1的次数。左移的次数就是二进制串的长度-1;变1的次数就是二进制串中1的个数;由于左移的次数在所有数中可以复用(所有数同时左移),故只需取最大的左移次数即可;哈哈我真聪明。第二题经典第二题脑瘫题第三题dp,其实就是一行一行加上去,第n行的结果取原创 2021-05-04 21:40:19 · 134 阅读 · 0 评论 -
Leetcode每日随机2021/5/3
题思我发现leetcode有一个模拟面试的功能,随机三道题(一般会有一道困难,一或两道中等),90分钟。那以后就做这个吧。第一题[中等]我看了一下其实这题以前做过,以前做的比较暴力,今天的代码效率会好一些。第二题[中等]脑瘫题第三题[困难]没做出来,难受。题解我看了一下,写的乱七八糟的,百度了一下这是一个很经典的问题。题目翻译一下:给你一个数n,给你一组区间,让你用这组区间中的最少区间数覆盖0~n。我先按照左区间升序,因为他反正要覆盖所有,我们就把边界一步一步往右推就行原创 2021-05-03 23:34:31 · 189 阅读 · 0 评论 -
Leetcode每日随机2021/5/2
题思leetcode1016???这不就是调一下api?leetcode1691代码来自此题解好像很麻烦的样子,不想看了,做不出来。剑指offer48双指针,找到所有满足要求的子串。复杂度2n。这题和主站第三题一样,看了一眼以前的做法,真的暴力哈哈。代码leetcode1016class Solution { public boolean queryString(String S, int N) { for (int i = 1; i <= N; i++)原创 2021-05-02 22:20:12 · 91 阅读 · 0 评论 -
Leetcode每日随机2021/5/1
题思leetcode714贪心没做出来,题解里虽然给出了贪心的解法,但是不好理解,不如它给的dp的做法简洁。dp的办法很好,我很喜欢。leetcode180这题目根本就不对,谁说Id一定连续?答案居然是默认Id连续,真的无语。leetcode1688模拟题,照着题意走一遍。代码leetcode714class Solution { public int maxProfit(int[] prices, int fee) { int[][] dp = new int[pr原创 2021-05-01 16:58:48 · 136 阅读 · 0 评论 -
Leetcode每日随机2021/4/30
题思最近很难遇到做不出来的题了,有点没意思。。。leetcode435贪心,先按照右区间从小到大排个序,依次看能不能加入,只要当前左区间大于等于上一个的右区间就能加入,而且这个一定是最优解。leetcode1754贪心,显然谁的第一个字母大就加谁,如果相等,则看他们的后一个字母谁大,再相同就再看后一个……所以写了一个方法判断两个字符串谁大。leetcode1292纯暴力居然也能过啊。代码leetcode435class Solution { public int er原创 2021-04-30 15:54:46 · 129 阅读 · 1 评论 -
Leetcode每日随机2021/4/29
题思leetcode134按照规则从每一个加油站走一遍就行了。leetcode914做一个个数统计,然后求所有个数的最大公约数。leetcode1249就一个栈呗,能不能搞点有难度的题啊。代码leetcode134class Solution { public int canCompleteCircuit(int[] gas, int[] cost) { for (int i = 0; i < cost.length; i++) { if (cost[i]原创 2021-04-29 16:17:13 · 161 阅读 · 0 评论 -
Leetcode每日随机2021/4/28
题思leetcode93普通DFS。leetcode1551这是在逗我吗?这是中等题?这也太傻比了leetcode1154傻卵,考常识?代码class Solution { private List<List<String>> res = new ArrayList<List<String>>(); private Stack<String> stack = new Stack<String>();原创 2021-04-28 15:45:00 · 199 阅读 · 0 评论 -
Leetcode每日随机2021/4/27
题思leetcode1631bfs暴力解的,记录到达当前节点的最小的体力值消耗,直至所有节点不在有更新(队列为空)。leetcode1356弱智题。代码leetcode1631class Solution { public int minimumEffortPath(int[][] heights) { Map<String, Integer> map = new HashMap<String, Integer>(); Queue<Str原创 2021-04-27 20:50:41 · 81 阅读 · 0 评论 -
Leetcode每日随机2021/4/26
题思leetcode1005每次取最小的就行,小根堆。leetcode1655还是费了一些时间,一开始想着是不是能直接贪心做,搞了半天发现不行的。后来dfs暴力就过了,还是数据量比较小。代码leetcode1005class Solution { public int largestSumAfterKNegations(int[] A, int K) { Queue<Integer> queue = new PriorityQueue<Integer&g原创 2021-04-26 17:03:10 · 92 阅读 · 0 评论 -
Leetcode每日随机2021/4/25
题思leetcode1018被5整除无非就是个位是0或者5,因此我们每次都记录一下个位数是什么就行了。剑指offer21一开始另开了一个数组,过了,而且效率很高。但是又看了一下题意,调整的意思应该是原地,所以又写了一个空间复杂度是O(1)的版本,按理说时间复杂度也是O(n),为什么跑出来的效果差这么多呢。代码leetcode1018class Solution { public List<Boolean> prefixesDivBy5(int[] A) { Lis原创 2021-04-25 16:08:58 · 85 阅读 · 0 评论 -
Leetcode每日随机2021/4/24
题思leetcode732不长记性啊,还是没做出来。其实跟我的日程安排2是一样的。确实秀,但是我还是忘了。官方题解写的很漂亮。剑指offer38普通的深搜就能过,数据范围太小了。代码leetcode732class MyCalendarThree { Map<Integer, Integer> map = new TreeMap<Integer, Integer>(); public MyCalendarThree() { } publi原创 2021-04-24 17:18:39 · 101 阅读 · 0 评论 -
Leetcode每日随机2021/4/23
题思leetcode804脑瘫题leetcode118又是一道脑瘫题代码leetcode804class Solution { String[] morse = { ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", "原创 2021-04-23 16:57:42 · 97 阅读 · 0 评论 -
Leetcode每日随机2021/4/22
题思今天碰到两道简单啊leetcode160我并没有完全按照要求做,还是开了set。如果空间复杂度O(1)的话这题可真不是简单题。题解中O(1)的做法确实很秀。leetcode929傻逼题代码leetcode160/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { *原创 2021-04-22 16:22:07 · 125 阅读 · 0 评论 -
Leetcode每日随机2021/4/21
题思leetcode679我放弃的比我想象的要快。5分钟,大概就放弃了。看了题解并不难,只是一个穷举。题解。leetcode620SQL题又来了,这题也太蠢了吧。代码leetcode679class Solution { private double min = 1e-6; public boolean judgePoint24(int[] nums) { List<Double> list = new ArrayList<Double>()原创 2021-04-21 16:36:05 · 90 阅读 · 0 评论 -
Leetcode每日随机2021/4/20
题思leetcode815就普普通通一道广搜的题,这也算困难吗面试题17.17我就把每个字母的位置都记录了一遍,一个个比对过去,居然也过了代码leetcode815class Solution { public int numBusesToDestination(int[][] routes, int source, int target) { int minBuses = -1; List<Set<Integer>> list = new Arr原创 2021-04-20 16:26:43 · 101 阅读 · 0 评论 -
Leetcode每日随机2021/4/19
题思面试题17.14堆leetcode1091就是一道普普通通的bfs,额外记录一下当前步数即可代码面试题17.14class Solution { public int[] smallestK(int[] arr, int k) { Queue<Integer> queue = new PriorityQueue<Integer>((a, b) -> b - a); for (Integer i : arr) { queue.off原创 2021-04-19 17:29:41 · 93 阅读 · 0 评论 -
Leetcode每日随机2021/4/18
题思今天这两题都是树,写的不是很满意,又臭又长的leetcode1325我是这样想的:把val为target的节点和他们的父节点都找出来放到一个列表里把target叶子节点从列表中刹车农户,同时其val设为0把val为0的孩子置为null重复23直至列表大小不在变化leetcode95我是这样想的:5. 先把n的全排列全算一遍6. 按照每一种排列的顺序构造一颗二叉搜索树7. 因为可能重复(同一种排列构造出来的二叉搜索树是一样的,如213和231),用扩充二叉树唯一标识一棵原创 2021-04-18 18:04:19 · 117 阅读 · 0 评论 -
Leetcode每日随机2021/4/17
题思每天两道吧,一道有点少。leetcode363看了题解,dp。主要是有一个小技巧没想到,dp[i][j]代表从0,0开始到i,j的和,那么对于每一个区间[row1,row2,col1,col2]而言,sum = dp[row2][col2] - dp[row1][col2] - dp[row2][col1] + dp[row1][col1],边界情况考虑一下即可。时间复杂度O(m^2 n^2)leetcode299这题就比较简单了,直接做一个数字个数的统计就行了。代码leetco原创 2021-04-17 16:10:10 · 108 阅读 · 0 评论 -
Leetcode每日随机2021/4/16
题思又来数学题啊,这打死我也做不出来啊,5种进位情况分类讨论,真有你的。思路参考自此题解,这位老哥直接给5中分类画了个表,很清楚。代码class Solution { public int[] addNegabinary(int[] arr1, int[] arr2) { if (arr1.length == 1 && arr1[0] == 0) { return arr2; } if (arr2.length == 1 && arr2原创 2021-04-16 16:58:25 · 90 阅读 · 0 评论 -
Leetcode每日随机2021/4/15
题思深搜暴力解的代码class Solution { Stack<int[]> stack = new Stack<int[]>(); int max = 0; public int maximumRequests(int n, int[][] requests) { dfs(requests, 0, n); return max; } private void dfs(int[][] requests, int idx, int n) {原创 2021-04-15 16:18:30 · 77 阅读 · 0 评论 -
Leetcode每日随机2021/4/14
题思最优策略就是每次都拿aliceValue+bobValue最高的。这题很土味。代码class Solution { public int stoneGameVI(int[] aliceValues, int[] bobValues) { int aliceScore = 0, bobScore = 0; int[][] value = new int[aliceValues.length][3]; for (int i = 0; i < value.length;原创 2021-04-14 16:00:21 · 124 阅读 · 0 评论 -
Leetcode每日随机2021/4/13
题思代码参考自这位大神的题解求最长公共子序列,dp.告诉我内存超了,我改成O(n)级别。又告诉我时间超了。我觉得n^2也还行啊,也就一亿。就非得nlogn才能彰显你是困难难度呗。代码class Solution { public int minOperations(int[] target, int[] arr) { Map<Integer, Integer> map = new HashMap<Integer, Integer>(); for (原创 2021-04-13 20:23:04 · 125 阅读 · 0 评论 -
Leetcode每日随机2021/4/12
题思其实我觉得我这代码效率应该是可以的,只遍历了一遍p;但是跑出来结果并不好看,很奇怪;思路就是两个指针start和end,end-start+1就是当前字符串的长度,每次只保存最长的字符串也就是个数。最后把以每个字母开头的最长有效字符串的长度加起来就是结果。个人还是比较满意今天的代码的。代码class Solution { public int findSubstringInWraproundString(String p) { Map<Character, Integ原创 2021-04-12 16:52:10 · 127 阅读 · 0 评论 -
Leetcode每日随机2021/4/11
题思这题也没啥好说的,就是中序遍历一遍就完事儿了。代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { private List<TreeNode>原创 2021-04-11 15:56:40 · 94 阅读 · 0 评论 -
Leetcode每日随机2021/4/10
题思这不是数学题么。出现一次的能力值位置必相同,直接加一;位置不同的能力值我试了一下1,2,3,4的全排列,期望也都是1;所以直接把数组去个重,统计一下个数就行了。其实是比较好解释的,假设有5个1,A第一个位置的1和B第一个位置的1是同一个1的概率是1/5,对于第二个位置,第三个位置……都是1/5,所以期望就是1.代码class Solution { public int expectNumber(int[] scores) { Set<Integer> set =原创 2021-04-10 20:00:48 · 127 阅读 · 0 评论 -
Leetcode每日随机2021/4/9
题思也是看了一眼就知道做不出来的题。代码参考自官方题解.其实不是那么难,正如题解中所说,就是求最大上升子序列的一个变种。代码class Solution { public int minDeletionSize(String[] strs) { int len = strs[0].length(); int[] dp = new int[len]; Arrays.fill(dp, 1); for (int i = 1; i < dp.length; i++) {原创 2021-04-09 15:47:11 · 76 阅读 · 0 评论 -
Leetcode每日随机2021/4/8
题思贪心,简单来说就是找到A中比B[i]大一点点的那个数,找不到就用当前可用的最小的数。A可以先排一下序,然后二分来找。代码class Solution { public int[] advantageCount(int[] A, int[] B) { Arrays.sort(A); boolean[] used = new boolean[A.length]; int[] res = new int[A.length]; for (int i = 0; i < B原创 2021-04-08 15:52:09 · 117 阅读 · 0 评论