随笔分类 - java leetcode
摘要:一、题目 二、解法 本题是二分法的变种。和标准二分问题的不同在于,二分后,两个区间不都是有序的,但必有一个有序,另一个可能有序也可能无序。 class Solution { public int search(int[] nums, int target) { int len=nums.length
阅读全文
摘要:输入:nums1 = [4,1,2], nums2 = [1,3,4,2]. 输出:[-1,3,-1] 解释:nums1 中每个值的下一个更大元素如下所述: - 4 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。 - 1 ,用加粗斜体标识,nums2
阅读全文
摘要:class Solution { public int maxProfit(int[] prices) { int len=prices.length; // 0: no stock; 1: hold stock; 2: no stock & in frozen stage int[] dp=new
阅读全文
摘要:本质和买卖股票的最佳时机3一样。 class Solution { public int maxProfit(int k, int[] prices) { int len=prices.length; if(len==0||k==0) return 0; int k2=k*2; int[] dp=n
阅读全文
摘要:dp[0]: 第i天已经完成1次买入的最大利润 dp[1]: 第i天已经完成1次买出的最大利润 dp[2]: 第i天已经完成2次买入的最大利润 dp[3]: 第i天已经完成2次买出的最大利润 class Solution { public int maxProfit(int[] prices) {
阅读全文
摘要:不能简单用层次遍历把隔行的加起来,因为考虑单链表2->1->3->4,最大是2+4=6 f(node)表示占用node的最大值。g(node)表示不占用node的最大值。则: f(node)=node.val+g(node.left)+g(node.right) g(node)=max(f(node
阅读全文
摘要:思路:因为第一个和最后一个不能同时选,所以将环形分成两段[0,len-2]和[1,len-1],分别用"打家劫舍1"求解,然后求最大值即可。 class Solution { public int rob(int[] nums) { int len=nums.length; if(len==1) r
阅读全文
摘要:本题仍是0-1背包问题,只不过背包的容量限制从一维变成了两维。 dp[i][j]: 最多有i个0和j个1的最大子集的长度 转移方程: dp[i][j]=max(dp[i][j],dp[i-zeroNum][j-oneNum]+1) zeroNum,oneNum是当前遍历到的字符串中0和1的数量 cl
阅读全文
摘要:由于nums中元素全为正数,设nums所有元素之和为sum,加号之和为x,则减号的绝对值之和为sum-x,则 x-(sum-x)=target 得到x=(sum+target)/2 所以问题变成:在nums中选择子集,使得子集之和为x的方案数量。 dp[i][j]: 0~i下标中选择,使得子集和为j
阅读全文
摘要:本题和分割等和子集基本一样,将stones分成两堆,两堆的和要尽可能的相同。 class Solution { public int lastStoneWeightII(int[] stones) { int sum=0; for(int s:stones) sum+=s; int num=solv
阅读全文
摘要:先求出总和sum,要求出是否存在子集,使得子集和为sum/2。 本题看做一个0-1背包问题:物品的重量和价值就是元素值,背包总承重是sum/2,可以求出背包能放下的最大价值,如果该值正好等于sum/2,说明正好装满 class Solution { public boolean canPartiti
阅读全文
摘要:一、0-1背包 有n个物品,它们的重量分别为weight[i],价值分别为value[i],现有一个承重为m的背包,每个物品要么拿一个,要么不拿,问背包能装下的最大价值。 2.1 二维数组 直观的动态规划是二维数组 dp[i][j]表示在下标为0-i的物品中选择,且背包承重为j时的最大价值 最后要求
阅读全文
摘要:贪心思想:尽量在父节点上放摄像头 用后序遍历,三种状态: 0: 无摄像头,并且没被覆盖 -1: 无摄像头,且被覆盖了 1: 有摄像头 class Solution { int num=0; public int minCameraCover(TreeNode root) { if(postOrder
阅读全文
摘要:贪心: class Solution { public int maxProfit(int[] prices, int fee) { int n=prices.length; int low=prices[0]; int ans=0; for(int i=1;i<n;i++){ if(prices[
阅读全文
摘要:class Solution { public int monotoneIncreasingDigits(int n) { char[] arr=Integer.toString(n).toCharArray(); int len=arr.length; int k=len; for(int i=l
阅读全文
摘要:class Solution { public int eraseOverlapIntervals(int[][] intervals) { Arrays.sort(intervals,(a,b)->a[1]-b[1]); int n=intervals.length; int right=inte
阅读全文
摘要:将数组排序:按照h降序,h相同的按照k升序。然后,遍历,并按照k,进行下标插入。 class Solution { public int[][] reconstructQueue(int[][] people) { Arrays.sort(people,(a,b)->{ if(a[0]!=b[0])
阅读全文
摘要:将数组按照绝对值的方法排序,从后往前,把绝对值大的负数变正即可。 java中自定义排序int[]比较麻烦,故我用的直接排序,用两个指针比较绝对值遍历。 class Solution { public int largestSumAfterKNegations(int[] nums, int k) {
阅读全文
摘要:解法1:贪心。 除去中间单调的节点即可。 class Solution { public int wiggleMaxLength(int[] nums) { int n=nums.length; int ans=1; int prevSub=0; for(int i=1;i<n;i++){ int
阅读全文
摘要:class Solution { public int findContentChildren(int[] g, int[] s) { Arrays.sort(g); Arrays.sort(s); int ans=0; for(int i=0,j=0;i<g.length&&j<s.length;
阅读全文