Day89(每日一题&二叉树) 442、数组中重复的数据给你一个长度为n的整数数组nums,其中nums的所有整数都在范围[1, n]内,且每个整数出现一次或两次。请你找出所有出现两次的整数,并以数组形式返回。你必须设计并实现一个时间复杂度为O(n)且仅使用常量额外空间的算法(空间复杂度为O(1))解决此问题需要注意的是,遍历数组nums的过程中,遍历到的元素num可能已经被改成负数,因此在计算下标index时需要对num取绝对值然后减1class Solution { p...
Day88(二叉树) 113、路径总和 II给你二叉树的根节点root和一个整数目标和targetSum,找出所有从根节点到叶子节点路径总和等于给定目标和的路径。回溯算法和二叉树的结合class Solution { List<List<Integer>>res=new ArrayList<>(); List<Integer>list=new ArrayList<>(); public List<List&l...
Day87(二叉树、滑动窗口) 106、从中序与后序遍历序列构造二叉树给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。细节1://利用后序遍历可得后序遍历的最后一个结点为根结点int rootValue=postorder[postEnd-1];不能使用postorder[postorder.length-1] 因为是递归,而每一次的根结点都会变化的,所以应该使用postEnd-1来.
Day86(二叉树——广度遍历) 103、二叉树的锯齿形层序遍历给你二叉树的根节点root,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。自上到下遍历,设根结点为第一层,那么当层数为奇数时,是从左到右遍历;当层数为偶数时,是从右到左遍历。if(deep%2==0) Collections.reverse(list);class Solution { public List<List<Integer>> zigzagLev...
Day85(二叉树的层序遍历、滑动窗口) 908、最小差值 I其中x是一个范围为[-k, k]的整数。对于每个索引i,最多只能应用一次此操作。当最小值加上k比最大值减去k还要大,那么说明最小值可以通过调节k的值(k∈[-k, k])使得两者最大值减最小值为0。故当min>max时,直接return 0【例子:示例3】class Solution { public int smallestRangeI(int[] nums, int k) { int max= Arrays.st...
Day84(滑动窗口) 3、无重复字符的最长子串给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度。注意细节:① 因为k-v k:字符 v:字符出现的索引位置。所以收缩窗口left是根据重复的字符的位置来,并不是直接++②left根据字符索引出现的位置上+1,并且不能后退。故left=Math.max(left,map.get(c)+1)【例子:abba】③max=Math.max(max,right-left);//不能写在if条件里,因为当s.length==1的时候,就只有一个字...
Day83(滑动窗口) 滑动窗口详解 - 知乎 (zhihu.com)438、找到字符串中所有字母异位词给定两个字符串s和p,找到s中所有p的异位词的子串,返回这些子串的起始索引。不考虑答案输出的顺序。异位词指由相同字母重排列形成的字符串(包括相同的字符串)。class Solution { public List<Integer> findAnagrams(String s, String p) { List<Integer>list=ne...
力扣题型总汇——滑动窗口 滑动窗口算法基本原理与实践 - huansky - 博客园 (cnblogs.com)滑动窗口算法在一个特定大小的字符串或数组上进行操作,而不在整个字符串和数组上操作,这样就降低了问题的复杂度,从而也达到降低了循环的嵌套深度。其实这里就可以看出来滑动窗口主要应用在数组和字符串上。这里采用的是字符串来讲解。但是对于数组其实也是一样的。滑动窗口算法的思路是这样: 我们在字符串 S 中使用双指针中的左右指针技巧,初始化 left = right = 0,把索引闭区间 [left, right] 称为
Day82(栈,优先级队列) 42、接雨水给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。暴力法class Solution { public int trap(int[] height) { int sum=0; for(int i=0;i<height.length;i++){ //第一个柱子和最后一个柱子不接雨水 if(i==0||i==height.length-1).
力扣题型总汇——栈和队列 由于栈结构的特殊性,非常适合处理对称匹配类的问题。最近相关性考虑栈 栈的特点先进后出栈还可以解决逆波兰表达式栈(Stack)——先进后出:stack<Integer>stack=new Stack<>();栈常用方法:1.boolean isEmpty( ):判断栈是否为空2.Object peek( ):返回位于栈顶的元素,但是并不在堆栈中删除它。3.Object pop( ):返回位于栈顶的元素,并在栈中删除它。——出栈4.Object push (Object e.
Day81(动态规划、十叉树遍历) 64、最小路径和给定一个包含非负整数的mxn网格grid,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。推导公式:dp[i][j]+=Math.min(dp[i][j-1],dp[i-1][j])+grid[i][j];class Solution { //注意是n行m列的矩阵,n和m可以不相等!!! public int minPathSum(int[][] grid) { int [][]...
Day80(动态规划——回文子串、打家劫舍) 647、回文子串给你一个字符串s,请你统计并返回这个字符串中回文子串的数目。回文字符串 是正着读和倒过来读一样的字符串。子字符串 是字符串中的由连续字符组成的一个序列。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。class Solution { public int countSubstrings(String s) { boolean [][]dp=new boolean[s.length()+1][...
Day79(动态规划——子序列之编辑距离、回文子序列) 72、编辑距离给你两个单词word1和word2,请返回将word1转换成word2所使用的最少操作数。你可以对一个单词进行如下三种操作:插入一个字符 删除一个字符 替换一个字符dp[i][j]表示:i表示word1的长度,j表示word2的长度,word1的前i个字母转换成word2的前j个字母所使用的最少操作。递推公式里:如果不相等,三种情况——1.去word1里删除,那么最少操作次数有+1word1.charAt(i-1)!=word2.charAt(...
Day78(动态规划——子序列) 392、判断子序列给定字符串s和t,判断s是否为t的子序列。(例如,"ace"是"abcde"的一个子序列,而“aec”不是)法一:双指针法二:动态规划dp[i][j]:表示字符串A的前i个[0,i)元素和字符串B的前j个[0,j)元素最长公共子序列为dp[i][j]class Solution { public boolean isSubsequence(String s, String t) { int[][]dp=new int[s...
Day77(动态规划——子序列) 674、最长连续递增序列给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。连续递增的子序列 可以由两个下标 l 和 r(l < r)确定,如果对于每个 l <= i < r,都有 nums[i] < nums[i + 1] ,那么子序列 [nums[l],nums[l + 1], ..., nums[r - 1], nums[r]] 就是连续递增子序列。因为要求的是连续的递增的子序列,所以nums[i]只需要和nums[i-1]比较大小,d
Day76(动态规划——子序列问题) 6037、按奇偶性交换后的最大数字给你一个正整数 num 。你可以交换 num 中 奇偶性 相同的任意两位数字(即,都是奇数或者偶数)。第一次看错题了,以为是奇偶索引class Solution { public int largestInteger(int num) { //暴力 //每次找到的数字若为偶数,则向后遍历,寻找更大的偶数,若存在,则交换位置,否则不做处理 //每次找到的数字若为奇数,则向后遍历,寻找更大的奇数,若存在.
Day75(完全背包) 279、完全平方数给你一个整数n,返回和为n的完全平方数的最少数量。完全平方数是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9和16都是完全平方数,而3和11不是。物品重量是i*i,所以遍历背包容量时,从物品重量i*i开始遍历class Solution { public int numSquares(int n) { //完全背包问题——最值问题 //背包容量:n 物品重量...
Day74(完全背包练习以及01背包的复习) 1094、最后一块石头的重量 II(01背包)有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:如果x == y,那么两块石头都会被完全粉碎; 如果x != y,那么重量为x的石头将会完全粉碎,而重量为y的石头新重量为y-x。最后,最多只会剩下一块石头。返回此石头最小的可能重量。如果没有石头剩下,就...