![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
weixin_43478710
这个作者很懒,什么都没留下…
展开
-
力扣每日一题(分割数组)
2、从左往右遍历,如果当前元素比左边数组的最大值小就更新分界点和左边数组的最大值,因为当前元素比左边数组的最大值小,那肯定是小于右边数组的最小值,而且题目保证了左边数组肯定有一个数是比右边数组小的。1、先构建一个后缀最大值的数组,然后遍历数组,如果当前元素比后一个位置的后缀最大值小就返回当前元素的长度,因为是长度尽可能小,所以找到就可以直接返回。原创 2022-10-24 18:25:30 · 206 阅读 · 1 评论 -
力扣每日一题(优势洗牌)
题目的意思是田忌赛马,就是在nums1中选择比其大的最小数,若不存在这样的数字,则选择nums1中的最小值,用nums1的最小值比nums2的最小值,如果nums1的最小值比nums2的最小值大,就取nums1的最小值,如果小,否则就取用最小值去比nums2的最大值。开始比较,8比11小,就用最差的马比最强的马,把8放到32的位置,右指针减1,变成2,此时结果数组为。先把nums1排序变成8,12,24,32,再排序nums2,只排序下标为3,0,1,2,输出:[24,32,8,12]原创 2022-10-08 16:46:11 · 419 阅读 · 0 评论 -
力扣每日一题
要找每个元素的下一个小于等于它的元素,可以用单调栈,维护一个单调递增的栈,栈存储元素下标,当前元素比栈顶元素小表示栈顶元素找到了下一个小于等于它的元素,栈里面的元素都是没找到小于等于自己的元素的。当出现一个比栈顶小的元素时,我们根据大小不停地弹出栈顶当前元素就是小于等于该栈顶的第一个数了。两个循环从后面找小于等于当前数的,找到就结束内循环。...原创 2022-09-01 15:37:16 · 173 阅读 · 0 评论 -
LeetCode #77 组合
一、题目二、思路回溯,可以剪枝,剪枝条件是for循环选择的起始位置之后的元素个数 已经不足 我们需要的元素个数了,那么就没有必要搜索了,例如n=4,k=3,从3开始是不能形成有3个数的组合,只需要从1、2开始搜搜索起点的上界 + 接下来要选择的元素个数 - 1 = n,例如n = 4,k = 3,path.size为1时,还要选择2个数,最大的搜索起点为3,最后一个组合为【3,4】接下来要选择的元素个数为k - path.size()所以搜索起点的上界 = n - (k - path.siz原创 2022-01-21 11:10:41 · 246 阅读 · 0 评论 -
LeetCode #63 不同路径 II
一、题目二、思路动态规划,如果有障碍物dp【i】【j】为0,否则就是dp【i-1】【j】+ dp【i】【j-1】三、代码实现 public int uniquePathsWithObstacles(int[][] obstacleGrid) { int r = obstacleGrid.length; int c = obstacleGrid[0].length; int[][] dp = new int[r][c]; if (obs原创 2022-01-21 10:01:36 · 50 阅读 · 0 评论 -
LeetCode #59 螺旋矩阵 II
一、题目二、思路设定四个边界,由外向内一层层模拟生成数字三、代码实现public int[][] generateMatrix(int n) { int[][] res = new int[n][n]; int num = 1; int left = 0, right = n - 1, up = 0, bottom = n - 1; while (left < right && up < bottom) {原创 2022-01-21 09:42:34 · 230 阅读 · 0 评论 -
Leetcode #57 插入区间
一、题目二、思路遍历所有区间,先找和插入区间不重叠的左边区间,条件是当前区间右边的值小于插入区间左边的值,再找和插入区间重叠的中间区间,条件是当前区间的左边的值小于等于插入区间右边的值,新插入区间左边的值是当前区间和插入区间左边较小的值,新插入区间右边的值是当前区间和插入区间右边较大的值,剩下的区间就是和插入区间不重叠的右边区间三、代码实现public int[][] insert(int[][] intervals, int[] newInterval) { List<in原创 2022-01-21 09:26:51 · 47 阅读 · 0 评论 -
LeetCode #47 全排列 II
一、题目二、思路回溯,因为有重复数字,所以要对重复的路径进行剪枝,要先对数组排序才能进行剪枝,剪枝的条件是当前数字和前一个数字相同,并且前一个数字可以用,例如1 1’ 2 第二个1’和第一个1相同,已有的路径是1 1’ 2,选择第二个1’,因为第一个1可以选择所以可以生成路径1’ 1 2和1 1’ 2重复了,所以要剪枝//剪枝条件i > 0 && num[i-1] == num[i] && !visited[i-1]三、代码实现public List&l原创 2022-01-21 09:04:05 · 147 阅读 · 0 评论 -
LeetCode 45. 跳跃游戏 II
一、题目二、题解用贪心法,正着贪心和反着贪心反着贪心:假设最后一步能跳到最后的位置,然后从前往后找看是否有起跳点能跳到最后一个位置,有的话这个位置就是倒数第二到达的位置,一直推到第一个位置正着贪心:看第一个起跳点能跳多最远,然后当到达这个起跳点能跳的最远距离时就进行下一次跳跃,并更新下一个起跳点的最远距离,只需要遍历到倒数第二个位置,因为遍历最后一个位置肯定会进入if语句导致step多加一次三、代码实现//正着贪心public int jump(int[] nums) { in原创 2022-01-19 16:51:52 · 2549 阅读 · 0 评论 -
LeetCode Top100
颠倒二进制数使用分治,依次颠倒1位,2位,4位,8位,16位public int reverseBits(int n) { n = (((n & 0xaaaaaaaa) >>> 1) | ((n & 0x55555555) << 1)); n = (((n & 0xcccccccc) >>> 2) | ((n & 0x33333333) << 2)); n =原创 2022-01-04 11:41:25 · 403 阅读 · 0 评论 -
复习归并排序和快速排序
归并排序先分后合 后序遍历private int[] mergeSort(int[] nums, int left, int right, int[] tmp) { if (left >= right) { return nums; } int mid = (left + right)/2; mergeSort(nums,left,mid,tmp); mergeSort(nums,mid + 1原创 2021-12-28 17:17:16 · 272 阅读 · 0 评论 -
LeetCode复习 递归和分治系列
剑指 Offer 62 圆圈中最后剩下的数字 public int lastRemaining(int n, int m) { int[] res = new int[n+1]; res[1] = 0; for (int i = 2; i <= n; i++) { res[i] = (res[i-1] + m) % n; } return res[n+1]; }#108 将有序数组转原创 2021-12-28 17:02:32 · 146 阅读 · 0 评论 -
LeetCode复习 计数系列
#387 字符串中的第一个唯一字符 public char firstUniqChar(String s) { char[] chars = s.toCharArray(); int[] map = new int[26]; for (int i = 0; i < chars.length; i++) { map[chars[i] - 'a'] += 1; } for (int i = 0; i原创 2021-12-27 09:40:09 · 101 阅读 · 0 评论 -
LeetCode复习 滑动窗口系列
#3 无重复字符的最长子串public int lengthOfLongestSubstring(String s) { Map<Character, Integer> map = new HashMap<>(); int res = 0; int start = 0; for (int i = 0; i < s.length(); i++) { if (map.containsKey(s原创 2021-12-25 11:39:02 · 147 阅读 · 0 评论 -
LeetCode复习 前缀和系列
#238 除自身以外数组的乘积 public int[] productExceptSelf(int[] nums) { int[] res = new int[nums.length]; int k = 1; //算出左边的乘积 for (int i = 0; i < nums.length; i++) { res[i] = k; k *= nums[i]; } k原创 2021-12-24 14:23:33 · 173 阅读 · 0 评论 -
LeetCode复习 回溯系列
#17 电话号码的字母组合List<String> letterCom = new ArrayList<>(); public List<String> letterCombinations(String digits) { String[] letterMap = {" ","*","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"}; letterCombinationsDfs(原创 2021-12-23 20:28:21 · 487 阅读 · 0 评论 -
LeetCode复习 设计系列
#303 区域和检索 - 数组不可变static class NumArray { int[] preSum; public NumArray(int[] nums) { preSum = new int[nums.length]; preSum[0] = nums[0]; for (int i = 1; i < nums.length; i++) { preSum原创 2021-12-23 09:35:31 · 68 阅读 · 0 评论 -
LeetCode复习 栈系列
#20 有效的括号public boolean isValid(String s) { char[] chars = s.toCharArray(); if (chars.length % 2 != 0) { return false; } Deque<Character> left = new LinkedList<>(); for (char aChar : chars) .原创 2021-12-17 10:52:09 · 836 阅读 · 0 评论 -
LeetCode复习 位运算系列
剑指 Offer 64 求1+2+…+nint sumNum = 0; public int sumNums(int n) { //短路效应 只要n小于等于1,sumNums(n-1) > 0就不会执行 boolean x = (n > 1) && sumNums(n-1) > 0; return sumNum += n; }剑指 Offer 56 - II 数组中数字出现的次数 IIpublic i原创 2021-12-16 08:56:29 · 57 阅读 · 0 评论 -
LeetCode复习 双指针系列
移除重复项public int removeDuplicates(int[] nums) { int left = 0, right = 0; while (right < nums.length) { if (nums[left] == nums[right]) { right++; //找到不重复的元素 } else { n.原创 2021-12-13 11:48:50 · 168 阅读 · 0 评论 -
KMP算法
KMP算法的作用就是用来解决这道题:可以快速地在原串中找到匹配字符串,haystack是原串,needle是匹配字符串KMP算法的关键是next数组,next数组原创 2021-12-11 20:55:18 · 234 阅读 · 0 评论 -
LeetCode复习 矩阵系列
顺时针打印矩阵 public int[] spiralOrder(int[][] matrix) { int r = matrix.length; if (r == 0) { return new int[0]; } int c = matrix[0].length; int left = 0, right = c - 1, up = 0, bottom = r - 1; int[] r原创 2021-12-10 09:05:49 · 186 阅读 · 0 评论 -
LeetCode复习 二分查找系列
搜索插入位置public int searchInsert(int[] nums, int target) { int left = 0, right = nums.length - 1; //没找到值左指针会指向最小大于target的值 while (left <= right) { int mid = (left + right)/2; int num = nums[mid]; .原创 2021-12-08 09:06:49 · 143 阅读 · 0 评论 -
LeetCode复习 BFS系列
二叉树的最小深度public int minDepth(TreeNode root) { LinkedList<TreeNode> queue = new LinkedList<>(); queue.offer(root); int depth = 1; while (!queue.isEmpty()) { //第一个发现的叶子结点就是最小深度 int size = qu原创 2021-12-07 08:44:15 · 149 阅读 · 0 评论 -
LeetCode复习 排序系列
合并两个有序数组 public void merge(int[] nums1, int m, int[] nums2, int n) { int i = 0, j = 0, k = 0; int[] ints = new int[m+n]; while (i < m && j < n) { if (nums1[i] < nums2[j]) { ints[k] = num原创 2021-12-06 10:46:21 · 42 阅读 · 0 评论 -
LeetCode复习 DFS系列
岛屿数量public int numIslands(char[][] grid) { int r = grid.length; int c = grid[0].length; int res = 0; for (int i = 0; i < r; i++) { for (int j = 0; j < c; j++) { if (grid[i][j] == '1') {原创 2021-12-03 20:42:41 · 140 阅读 · 0 评论 -
LeetCode复习 动态规划系列
最大子序和 int preMax = nums[0]; int res = preMax; for (int i = 1; i < nums.length; i++) { //前一位置是负数,对本位置没贡献 preMax = Math.max(preMax,preMax + nums[i]); res = Math.max(res,preMax); } return原创 2021-11-26 17:17:45 · 258 阅读 · 0 评论