Leetcode刷题
给爷学
Dale_zero
从零开始吧!
展开
-
LeetCode 316. Remove Duplicate Letters
有点奇怪的一道题 题意是将字符串s内出现的每种字母只保留一个 并要求字典序最小有点类似优先队列的思想,遍历s的同时维护一个结果串ans,当出现未访问过的字符c时,从后往前查看结果串的字符,如果结果串ans当前的字符cc,满足cc>c 并且原串s后面还会出现cc,就把cc删除。从后往前删除所有这样的cc后,把c添加到ans的末尾。最后ans就是答案class Solution { public String removeDuplicateLetters(String s) {原创 2022-01-13 16:20:44 · 3973 阅读 · 0 评论 -
LeetCode 264. Ugly Number II
找出第n个ugly number(因数只有2 3 5)代码写得很巧妙 学到了因为每一轮都会将cur与2 3 5 分别判断一遍,所以不会有重复值class Solution { public int nthUglyNumber(int n) { ArrayList<Integer> ans = new ArrayList<>(); ans.add(1); int i2 = 0, i3 = 0, i5 = 0;原创 2022-01-07 04:17:23 · 188 阅读 · 0 评论 -
LeetCode 275. H-Index II
二分法查找最大的value 使得大于等于value的值有value个设数组长度为n,如果当前二分到i,如果从i到n的数组片段中,nums[i] > n-i 说明该value比i小,就往下查找,如果nums[i] < n-i 说明该value至少比nums[i]大 向上找,直到找到最大的nums[i] 满足 nums[i] > n - i, 答案为n-iclass Solution { public int hIndex(int[] citations) {原创 2022-01-07 03:56:36 · 128 阅读 · 0 评论 -
201. Bitwise AND of Numbers Range
可以观察二进制的规律,第0位每一个数变一次,第1位每2个数变一次,第2位没四个数变一次。可以推出来如果如果想让第i位所有数全为1,需要range<=2^i, 并且左右边界在该位置都是1class Solution {public: int rangeBitwiseAnd(int left, int right) { int dig = 0; int ans = 0; long n = (long)right-left +1;原创 2022-01-05 11:42:36 · 175 阅读 · 0 评论 -
LeetCode 73. Set Matrix Zeroes
用matrix[0][j] 记录第j列是否为0用matrix[i][0]记录第i行是否为0因为在0 0 位置有重复,所以新开个变量记录第0行或者第0列更新的时候先更新从第1行开始和从第1列开始妙啊 哭了class Solution { public void setZeroes(int[][] matrix) { int m = matrix.length; int n = matrix[0].length; int flag =原创 2021-11-29 17:28:56 · 222 阅读 · 0 评论 -
LeetCode 81. Search in Rotated Sorted Array II
二分搜索会有问题,因为数组中有重复的值所以在判断时,如果nums[l] == nums[r] l+=1原创 2021-11-27 12:02:35 · 237 阅读 · 0 评论 -
LeetCode 45. Jump Game II
双指针 On遍历一遍就好找出当前步数能到达的最远距离,直到距离覆盖了目标点class Solution { public int jump(int[] nums) { int n = nums.length; int l = 0; int r = 0; int ans = 0; while(l<=r){ if(r>=n-1) return an原创 2021-11-26 11:01:32 · 3009 阅读 · 0 评论 -
LeetCode 223 223. Rectangle Area
计算两个矩形union的面积若相离 直接返回面积之和若相交或包含,需要减去相交的面积相交的面积 = (最小上界-最大下界)* (最小右界-最大左界)class Solution { public int computeArea(int ax1, int ay1, int ax2, int ay2, int bx1, int by1, int bx2, int by2) { int ans = (ay2-ay1)*(ax2-ax1) + (by2-by1)*(bx2-原创 2021-11-18 05:50:22 · 259 阅读 · 0 评论 -
49. Group Anagrams
对每个字符串内部按字母排序,如果是相同组成的字符串,排序后的串应该是相同的所以可以用这个排序后的串当做key来hashclass Solution { public List<List<String>> groupAnagrams(String[] strs) { List<List<String>> ans = new ArrayList<>(); int n = strs.length;原创 2021-10-30 03:26:51 · 143 阅读 · 0 评论 -
LeetCode 135. Candy
找出每个child分别相对于左边和右边的最长递增序列长度,取两者最大值就是他最后应该获得的糖数class Solution { public int candy(int[] ratings) { int ans = 0; int n = ratings.length; int []left = new int[n]; int []right = new int[n]; left[0] = 1; ri原创 2021-10-29 04:18:47 · 3113 阅读 · 0 评论 -
LeetCode 767. Reorganize String
给定字符串s,把他变成相邻两个字母不相同的形状先变成相邻字符聚在一起的形状,然后重新填装,先填偶数index,再填奇数index丑陋代码class Solution { public String reorganizeString(String s) { int []cnt = new int[26]; int n = s.length(); for(int i=0;i<n;i++) cnt[s.charAt原创 2021-10-29 03:14:34 · 109 阅读 · 0 评论 -
LeetCode 1547. Minimum Cost to Cut a Stick
dp[i][j] 代表从第i个点到第j个点的尺子段被切断需要的最小cost从小到大枚举i到j的长度class Solution { public int minCost(int n, int[] cuts) { int[] newCuts = new int[cuts.length + 2]; newCuts[0] = 0; for(int i=0;i<cuts.length;i++){ newCuts[i+1]原创 2021-09-30 10:20:36 · 121 阅读 · 0 评论 -
LeetCode 116. Populating Next Right Pointers in Each Node
前提:是完美二叉树用层次遍历的方法,但是因为上一层已经有了next节点,所以就不需要队列来维护顺序,直接判断next是否为空和父子节点的关系,就能确定下一个节点的位置复杂度为O(n)/*// Definition for a Node.class Node { public int val; public Node left; public Node right; public Node next; public Node() {} ...原创 2021-09-24 12:05:40 · 220 阅读 · 0 评论 -
Leetcode 146. LRU Cache
两种做法:1 双向队列+HashMap2 直接用java的LinkedHashMap,同时重写它的removeEldestEntry逻辑,当容量超过capacity时移除class LRUCache {lruLinkedHashMap <Integer,Integer>map = new lruLinkedHashMap();int cap; private class lruLinkedHashMap<K,V> extends LinkedHashMa原创 2021-09-24 11:07:35 · 91 阅读 · 0 评论 -
Java String Integer互相转
String 转 Integer:Integer.parseInt(str);Integer.valueOf(str);Integer 转 String:Integer.toString(num);String.valueOf(num);原创 2021-09-24 09:50:03 · 122 阅读 · 0 评论 -
Java 先序 中序 后序的非递归
先序:直接用stack遍历,vis当前元素后按顺序压栈右儿子,压栈左儿子中序:压栈当前节点后接着压栈左儿子,当左儿子为空时vis栈顶元素,压栈栈顶元素的右儿子 Stack<TreeNode> s = new Stack<>(); TreeNode head = root; while(!s.empty() || head!=null){ if(head!=null){ s.原创 2021-09-22 14:18:37 · 137 阅读 · 0 评论 -
LeetCode 1382. Balance a Binary Search Tree
将一颗二叉搜索树变平衡二叉搜索树的特点:不管结构如何,中序遍历序列不变So 先得到中序序列,再构建平衡树/** * 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 14:01:04 · 129 阅读 · 0 评论 -
Leetcode 279 Perfect Squares
每条边距离为1的Dij,求从n到0的距离class Solution { public int numSquares(int n) { PriorityQueue<Pair<Integer,Integer>> q = new PriorityQueue<Pair<Integer,Integer>>((a,b) -> a.getValue() - b.getValue());原创 2021-09-22 13:18:52 · 125 阅读 · 0 评论 -
LeetCode 329. Longest Increasing Path in a Matrix
记忆化dfs 用dp数组保存每次dfs的结果,下次直接拿出来用class Solution { int [][]dp = new int[210][210]; int [][] ma; int []ofx = {1,-1,0,0}; int []ofy = {0,0,1,-1}; int n,m; int ans = 0 ; public int longestIncreasingPath(int[][] matrix) { n原创 2021-09-10 13:42:58 · 101 阅读 · 0 评论 -
LeetCode 973. K Closest Points to Origin 优先队列
优先队列排序最后取出最小的k个class Solution { public int[][] kClosest(int[][] points, int k) { PriorityQueue<Pair<Integer,Integer>> q = new PriorityQueue<Pair<Integer,Integer>>((a,b) -> a.getValue() - b.getValue());原创 2021-09-10 13:10:28 · 100 阅读 · 0 评论 -
LeetCode 124. Binary Tree Maximum Path Sum
要注意两个逻辑:递归更新ans的值① 跟最终结果ans比大小时,要用“穿过当前节点的路径”,也就是左右子树可以一起选②递归返回上一层时,要选左右子树最多只能选一个,或者不选。当组成的最大值为负数时直接返回0/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNod原创 2021-09-09 10:23:34 · 111 阅读 · 0 评论 -
LeetCode 36. Exclusive Time of Functions
用栈模拟cpu的任务队列注意:开始时间给的是某一秒钟的开始,结束时间给的是某一秒钟的结尾class Solution { public int[] exclusiveTime(int n, List<String> logs) { Stack<Pair<Integer,Integer>> cpu = new Stack<>(); int len = logs.size(); String []t原创 2021-09-09 09:56:02 · 111 阅读 · 0 评论 -
LeetCode 29. Divide Two Integers 注意负数的移位运算
因为负数的范围更大,所以用负数来表示商,同时特判商为-2^32的情况用移位和减法来循环模拟除法,最多计算32次PS:负数右移一位时负奇数 和除以二结果不同(因为要除以二截断,但是和正数截断的方向不一致)负偶数和除以二结果相同所以注意这点class Solution { public int divide(int dividend, int divisor) { int r = (1<<30)-1; r = r+r+1; .原创 2021-09-09 05:29:30 · 363 阅读 · 0 评论 -
Java 排序Pair List的写法
List<Pair<Integer,Integer>> check = new ArrayList<>();Collections.sort(check,(a,b)->a.getKey()-b.getKey());//lambda表达式,按左值从小到大排序如果是数组, 要用Arrays.sort()原创 2021-09-08 13:05:49 · 1205 阅读 · 0 评论 -
LeetCode 632. Smallest Range Covering Elements from K Lists
把所有元素按值排序之后,用双指针找出最小的包含每个list元素的区间class Solution { public int[] smallestRange(List<List<Integer>> nums) { List<Pair<Integer,Integer>> check = new ArrayList<>(); int n = nums.size();原创 2021-09-08 13:03:42 · 159 阅读 · 0 评论 -
Java Pair Queue使用
创建Pair : Pair<Integer, Integer> pair = new Pair<>(10,10); //不能用基本数据类型取值: pair.getKey() pair.getValue()创建Queue : Queue<Integer> q = new LinkedList<>();入队: q.offer() 出队 q.poll(); 这两个操作出错时会返回false入队: q.add() 出队 q.remove();这两个原创 2021-09-06 14:31:46 · 466 阅读 · 0 评论 -
LeetCode 621. Task Scheduler
CPU调度问题设一共x种任务,每种任务的件数不同,完成一件任务需要1时间单位,相同的两个任务之间要间隔n时间单位才能做。问最后要多久能完成所有任务找出 件数最多的任务,设为A,要完成k次所以至少需要的时间是(k-1)*(n+1)+1比如n=2时候这个模式就是 A_ _ A _ _ A.......中间可以添加其他任务,因为其他任务的数量都没有A多,所以都可以填到A后面的空格而且!就算n太小了,空格填满了。有其他人物的时候直接填到每个模块末尾就好了!!这点想了好久,我真的弱智。..原创 2021-09-02 15:02:35 · 195 阅读 · 0 评论 -
LeetCode 736. Parse Lisp Expression
给出类似于lisp的表达式(前序表达式),新加入了let赋值语句注意:把每一句子表达式都抽象成了Exp对象,一个父exp包含了1个或者多个子Exp,从后向前遍历压栈,到最后统一出栈计算,妙啊!class Solution { class Exp { Stack<Exp> exps; String op; Exp parent; Exp(Exp from) { this.exps = new原创 2021-08-24 07:43:41 · 238 阅读 · 0 评论 -
LeetCode 284. Peeking Iterator
利用java的Iterator实现peek(类似于队列的top)利用cur变量保存当前指针指向的值,对每一个函数进行特判// Java Iterator interface reference:// https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.htmlclass PeekingIterator implements Iterator<Integer> { Iterator <Integer原创 2021-08-24 06:56:56 · 141 阅读 · 0 评论 -
LeetCode382. Linked List Random Node
从n个数中取k个数,保证每个数拿到的概率相同蓄水池模型1.先取前k个到缓冲区(蓄水池)中2从第k+1个开始,每一个数字(记为第i个数字)都有机会被选中顶替现有池子中的一个数,概率为k/i3如果被选中,池子中每个数字被替换的概率为1/k(问题规模缩小为k=1)设当前正在遍历i+1个数,该数被选中的概率为k/(i+1)在此前i个数中每个数被选中的概率为k/i,本轮被淘汰的概率为k/(i+1) * 1/k.则本轮不被淘汰的概率就是1 -k/(i+1) * 1/k = i/(i+1),则总.原创 2021-07-21 00:30:58 · 126 阅读 · 0 评论 -
LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal 二叉树构建(dfs)
dfs每次规定前序和中序的边界,递归构建左右儿子注意预处理每个序号在中序里的位置,以免超时/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * Tre原创 2021-07-20 23:16:42 · 88 阅读 · 0 评论 -
leetcode 28. Implement strStr()
kmp模板这次没看模板自己撸的,变成还是要灵活呀class Solution { public int strStr(String haystack, String needle) { if(needle.equals("")) return 0; if(haystack.equals("")) return -1; int n = haystack.length(); int原创 2021-07-17 17:12:49 · 124 阅读 · 0 评论 -
LeetCode 39. Combination Sum
ti题目链接:题目链接:https://leetcode.com/problems/combination-sum/用给定数组中的数组成target,每个数可以用无限次dfs,每一层遍历该层的数字最多能使用的次数(可以使用0次,也就是不选这个数)。这样可以保证不会重复,而且每个数字都能用到。class Solution { List<List<Integer>> ans = new ArrayList<>(); int []nums ..原创 2021-06-23 21:52:44 · 253 阅读 · 2 评论 -
zoj 4029 2018浙江省赛F Now Loading!!!
题目链接:zoj 4029用n^2不现实,考虑到某些数字对于用一个p的log值相等,所以可用二分解决用到了c++的upper_bound,找到比当前值大的第一个数字在数组中的位置,然后一个前缀数组算出分子的和#include<iostream>#include<cstdio>#include<vector>#include<set>#incl...原创 2018-05-04 20:15:24 · 537 阅读 · 0 评论