![](https://img-blog.csdnimg.cn/20190927151043371.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法总结
持续更新各种算法练习题,一起进步
路Louis
这个作者很懒,什么都没留下…
展开
-
二分查找leetcode.1760
public int minimumSize(int[] nums, int maxOperations) { int left = 1, right = Arrays.stream(nums).max().getAsInt(); int ans = 0; //在不超过给定次数情况下,找出最小的值 while (left原创 2022-12-22 20:30:04 · 52 阅读 · 0 评论 -
并查集leetcode.1697
public boolean[] distanceLimitedPathsExist(int n, int[][] edgeList, int[][] queries) { Arrays.sort(edgeList, (a, b) -> a[2] - b[2]);//边的权重排序 Integer[] index = new Integer[queries.length]; for (int i = 0; i < queries.length; i++)原创 2022-12-14 19:03:10 · 48 阅读 · 0 评论 -
动态规划leetcode.1691
public int maxHeight(int[][] cuboids) { for (int[] c : cuboids) Arrays.sort(c);//三条边排序 //所有长方体排序 Arrays.sort(cuboids, (a, b) -> a[0] != b[0] ? a[0] - b[0] : a[1] != b[1] ? a[1] - b[1] : a[2] - b[2]); int ans = 0,原创 2022-12-14 10:12:16 · 50 阅读 · 0 评论 -
动态规划leetcode.813
public double largestSumOfAverages(int[] nums, int k) { int n = nums.length; double[] prefix = new double[n + 1];//前缀和 for (int i = 0; i < n; i++) { prefix[i + 1] = prefix[i] + nums[i]; } double[][] dp =原创 2022-12-13 16:04:38 · 58 阅读 · 0 评论 -
回溯leetcode.1774
int res; public int closestCost(int[] baseCosts, int[] toppingCosts, int target) { res = Arrays.stream(baseCosts).min().getAsInt(); for (int b : baseCosts) { dfs(toppingCosts, 0, b, target); } return res;原创 2022-12-04 23:02:45 · 141 阅读 · 0 评论 -
广度优先搜索leetcode.864
//从起点开始后,每遇到一把钥匙,都会同时在该位置以新的状态开启新的广搜,这样会更新之前无法走过的位置 static int N = 35, K = 10, INF = 0x3f3f3f3f; static int[][][] dist = new int[N][N][1原创 2022-12-01 22:48:00 · 50 阅读 · 0 评论 -
动态规划leetcode.808
public double soupServings(int n) { n = (int) Math.ceil((double) n / 25);// if (n >= 179) { return 1.0; } double[][] dp = new double[n + 1][n + 1]; dp[0][0] = 0.5; for (int i = 1; i原创 2022-11-30 22:12:05 · 75 阅读 · 0 评论 -
二分查找+容斥原理leetcode.878
public int nthMagicalNumber(int n, int a, int b) { int mod=(int)1e9+7; long gcd=LCM(a,b);//最小公倍数 //二分查找左边范围的神奇数字个数>=n的最小值 long l=1,r=(long)1e18; while(l+1>1; long num=mi原创 2022-11-22 21:31:14 · 97 阅读 · 0 评论 -
前缀和+单调队列leetcode.862
public int shortestSubarray(int[] nums, int k) { int n = nums.length, ans = n + 1; var s = new long[n + 1]; for (var i = 0; i < n; ++i) s[i + 1] = s[i] + nums[i]; // 计算前缀和 var q = new ArrayDeque();原创 2022-11-05 11:34:47 · 98 阅读 · 0 评论 -
数位dp算法leetcode.902
private String[] digits; private char s[]; private int dp[]; public int atMostNGivenDigitSet(String[] digits, int n) { this.digits = digits; s = Integer.toString(n).toCharArray(); dp = new int[s.length]; Arrays原创 2022-11-01 16:25:36 · 79 阅读 · 0 评论 -
dp+二分查找leetcode.1235
public int jobScheduling(int[] startTime, int[] endTime, int[] profit) { int n = startTime.length; int[][] jobs = new int[n][3]; for (int i = 0; i < n; i++) { jobs[i] = new int[]{startTime[i], endTime[i], profit[i]};原创 2022-10-29 20:50:46 · 61 阅读 · 0 评论 -
单调栈leetcode.907
int MOD = (int)1e9+7; public int sumSubarrayMins(int[] arr) { int n = arr.length, ans = 0; Deque d = new ArrayDeque();//单调栈存储索引 for (int r = 0; r原创 2022-10-29 16:03:06 · 49 阅读 · 0 评论 -
广度优先搜索算法leetcode.934
private static final long MOD = (long) 1e9 + 7; public int sumSubarrayMins(int[] arr) { var ans = 0L; var st = new ArrayDeque(); st.push(-1); // 哨兵 for (var r = 0; r原创 2022-10-28 23:16:18 · 115 阅读 · 0 评论 -
单调栈leetcode.901
Deque stack;//存储之前的较大值和下标 int idx;//当前下标 public StockSpanner() { stack = new ArrayDeque(); stack.push(new int[]{-1, Integer.MAX_VALUE}); idx = -1; } public int next(int price) { idx++;原创 2022-10-21 22:22:12 · 96 阅读 · 0 评论 -
动态规划算法leetcode.940
public int distinctSubseqII(String s) { int mod = (int)1e9 + 7; long result = 0L; long[] letter = new long[26]; // 记录26个字符每个字符的子序列总数 for (char sc : s.toCharArray()) { long pre = letter[sc - 'a']; // 获得字符sc前一次统计的子原创 2022-10-18 10:38:47 · 93 阅读 · 0 评论 -
动态规划算法leetcode.801
public int minSwap(int[] nums1, int[] nums2) { //对于i位置有三种情况:仅交换成立,仅不交换成立,两者都成立 int[][] dp = new int[nums1.length][2];//表示i位置是否交换的最小次数 dp[0][0] = 0; dp[0][1] = 1; for (int i = 1; i < nums1.length; i++) { int a1原创 2022-10-11 09:31:13 · 57 阅读 · 0 评论 -
栈leetcode.856
public int scoreOfParentheses(String s) { Deque d = new ArrayDeque(); d.addLast(0); for (char c : s.toCharArray()) { if (c == '(') //(用0占位 d.addLast(0); else {//)则取出栈顶,若为(则+1,若为平衡字原创 2022-10-10 22:10:19 · 64 阅读 · 0 评论 -
贪心算法leetcode.870
public int[] advantageCount(int[] nums1, int[] nums2) { int n = nums1.length; //存储排序后的数对应的原索引 Integer[] idx1 = new Integer[n]; Integer[] idx2 = new Integer[n]; for (int i = 0; i < n; ++i) { idx1[i] = i;原创 2022-10-09 15:11:12 · 211 阅读 · 0 评论 -
数位dp算法leetcode.788
public int rotatedDigits(int n) { Set s1=new HashSet();//能翻转 s1.add(1); s1.add(2); s1.add(0); s1.add(5); s1.add(6); s1.add(8); s1.add(9); Set s2=new HashSet();原创 2022-09-25 20:11:45 · 114 阅读 · 0 评论 -
回溯算法leetcode.854
int result = Integer.MAX_VALUE; public int kSimilarity(String s1, String s2) { return execute(s1.toCharArray(), s2.toCharArray(), 0, 0); } public int execute(char[] sc1, char[] sc2, int start, int current) { if (current >= re原创 2022-09-22 09:38:21 · 52 阅读 · 0 评论 -
状态压缩+记忆化搜索leetcode.698
public boolean canPartitionKSubsets(int[] nums, int k) { int n=nums.length; Arrays.sort(nums); int sum=0; for(int i=0;i原创 2022-09-21 15:43:06 · 86 阅读 · 0 评论 -
回溯算法leetcode.698
public boolean canPartitionKSubsets(int[] nums, int k) { int n=nums.length; Arrays.sort(nums); int sum=0; for(int i=0;i原创 2022-09-21 14:51:47 · 78 阅读 · 0 评论 -
扫描线算法leetcode.850
int MOD = (int)1e9+7; public int rectangleArea(int[][] rs) { //将所有横坐标从小到大排序 List list = new ArrayList(); for (int[] info : rs) { list.add(info[0]); list.add(info[2]); } Collections.so原创 2022-09-17 16:19:30 · 75 阅读 · 0 评论 -
优先队列算法leetcode.857
public double mincostToHireWorkers(int[] qs, int[] ws, int k) { //由题意知,对于每个人,总金额>=总质量*单位质量工资 int n = qs.length; double[][] ds = new double[n][2];//存储单位质量工资和质量 for (int i = 0; i < n; i++) { ds[i][0] = ws[i] * 1.0原创 2022-09-11 21:16:23 · 67 阅读 · 0 评论 -
二分查找算法leetcode.1608
public int specialArray(int[] nums) { Arrays.sort(nums);//排序 int n=nums.length; if(nums[0]>=n) return n;//判断答案是否在数组最小值及其左边 int r=nums.length-1,l=0; //寻找答案范围 while(l>1;原创 2022-09-13 08:47:19 · 44 阅读 · 0 评论 -
二叉树序列化算法leetcode.652
Map map = new HashMap(); List ans = new ArrayList(); public List findDuplicateSubtrees(TreeNode root) { dfs(root); return ans; } String dfs(TreeNode root) { //将该树序列化存储在哈希表,判断是原创 2022-09-06 09:17:22 · 57 阅读 · 0 评论 -
贪心算法leetcode.646
public int findLongestChain(int[][] pairs) { int curr = Integer.MIN_VALUE, res = 0; Arrays.sort(pairs, (a, b) -> a[1] - b[1]); for (int[] p : pairs) { if (curr < p[0]) { curr = p[1]; res++原创 2022-09-04 10:19:19 · 98 阅读 · 0 评论 -
拓扑排序算法leetcode.剑指offer.115
int V;//顶点数量 Deque[] adj;//邻接表 int[] in;//存储每个顶点的入度 //添加一条边 public void addEdge(int v,int w){ if(!adj[v].contains(w)){ adj[v].offer(w); in[w]++; } } public boolean sequenceReco...原创 2022-07-26 10:52:26 · 49 阅读 · 0 评论 -
动态线段树leetcode.731
private Map tree;//线段树,表示某节点表示范围的最大预定数 private Map lazy;//懒标记 private int N; public MyCalendarTwo() { tree = new HashMap(); lazy = new HashMap(); N= (int原创 2022-07-19 22:23:37 · 46 阅读 · 0 评论 -
动态规划算法leetcode.741
//题意可等价为两个人a,b同时走,到最后的最优解 static int N = 51, INF = Integer.MIN_VALUE; static int[][][] f = new int[2 * N][N][N];//走了k步,a在i1行,b在i2行的解 public int cherryPickup(int[][] g) { int n = g.length; //初始化矩阵为负无穷,如果某位置的上一步不可到达,那么该位置也不可到达....原创 2022-07-19 22:24:08 · 48 阅读 · 0 评论 -
字典树leetcode.745
class TrieTree { //一棵前缀,一棵后缀 private Node root1;//根节点,没有值 private Node root2; //内部节点类 private class Node{ private Node childs[];//以下标为26个字母,存储下一个节点 private boolea.原创 2022-07-16 10:01:29 · 56 阅读 · 0 评论 -
递归算法leetcode.558
public Node intersect(Node quadTree1, Node quadTree2) { //当其中至少1个为叶子时 if (quadTree1.isLeaf) { if (quadTree1.val) //当一棵树为1叶子,该节点必为1叶子 return new Node(true, true); else//若为0叶子,该节点与另一棵树节点相同 .原创 2022-07-16 09:11:52 · 68 阅读 · 0 评论 -
字典树leetcode.676
private int dif;//剩余不同次数 private Node root;//根节点,没有值 //内部节点类 class Node{ int num;//该节点对应字符串数量 Node childs[];//以下标为26个字母,存储下一个节点 boolean isLeaf;//是否为叶子节点 public Node(){ ...原创 2022-07-12 22:01:54 · 52 阅读 · 0 评论 -
动态规划算法leetcode.873
public int lenLongestFibSubseq(int[] arr) { Map indices = new HashMap();//根据值寻找下标 int n = arr.length; for (int i = 0; i < n; i++) { indices.put(arr[i], i); } int[][] dp = new int[n][原创 2022-07-09 10:44:45 · 93 阅读 · 0 评论 -
记忆化搜索算法leetcode.241
//三种运算符 static final int ADDITION = -1; static final int SUBTRACTION = -2; static final int MULTIPLICATION = -3; public List diffWaysToCompute(String expression) { List ops = new ArrayList();原创 2022-07-02 12:15:51 · 56 阅读 · 0 评论 -
动态规划算法leetcode.1143
public int longestCommonSubsequence(String text1, String text2) { int n=text1.length(),m=text2.length(); int[][] dp=new int[n+1][m+1];//text1前i个字符与text2前j个字符的最长公共子序列长度 for(int i=1;i原创 2022-06-27 22:49:57 · 64 阅读 · 0 评论 -
动态线段树leetcode.715
private Map tree;//线段树,表示某节点的值 private Map lazy;//懒标记 private int N; public RangeModule() { tree = new HashMap(); lazy = new HashMap(); N= (int)1e9;原创 2022-06-24 21:43:39 · 67 阅读 · 0 评论 -
水塘抽样算法leetcode.497
Random r; int[][] rects; public Solution(int[][] rects) { r=new Random(); this.rects=rects; } public int[] pick() { //水塘抽样 int idx = -1, cur = 0, pre = 0, n = rects.length; for(int i = 0; i ...原创 2022-06-11 14:03:34 · 63 阅读 · 0 评论 -
动态线段树leetcode.699
//动态线段树public class DynamicSegTree { private Map tree;//线段树,表示某节点的值 private Map lazy;//懒标记 private int N;//最大范围 public DynamicSegTree() { tree = new HashMap(); lazy = ne原创 2022-06-11 10:26:48 · 131 阅读 · 0 评论 -
动态线段树leetcode.732
private Map tree;//线段树,表示某节点的值 private Map lazy;//懒标记 private int N;//最大范围 public MyCalendarThree() { tree = new HashMap(); lazy = new HashMap(); N= (int)1e9; } //区间修改(增加)......原创 2022-06-09 22:42:17 · 82 阅读 · 1 评论