02 2022 档案

摘要:本题仍是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 阅读全文
posted @ 2022-02-26 20:01 livingsu 阅读(32) 评论(0) 推荐(0) 编辑
摘要:由于nums中元素全为正数,设nums所有元素之和为sum,加号之和为x,则减号的绝对值之和为sum-x,则 x-(sum-x)=target 得到x=(sum+target)/2 所以问题变成:在nums中选择子集,使得子集之和为x的方案数量。 dp[i][j]: 0~i下标中选择,使得子集和为j 阅读全文
posted @ 2022-02-26 12:08 livingsu 阅读(23) 评论(0) 推荐(0) 编辑
摘要:本题和分割等和子集基本一样,将stones分成两堆,两堆的和要尽可能的相同。 class Solution { public int lastStoneWeightII(int[] stones) { int sum=0; for(int s:stones) sum+=s; int num=solv 阅读全文
posted @ 2022-02-23 15:01 livingsu 阅读(18) 评论(0) 推荐(0) 编辑
摘要:先求出总和sum,要求出是否存在子集,使得子集和为sum/2。 本题看做一个0-1背包问题:物品的重量和价值就是元素值,背包总承重是sum/2,可以求出背包能放下的最大价值,如果该值正好等于sum/2,说明正好装满 class Solution { public boolean canPartiti 阅读全文
posted @ 2022-02-23 12:08 livingsu 阅读(21) 评论(0) 推荐(0) 编辑
摘要:一、0-1背包 有n个物品,它们的重量分别为weight[i],价值分别为value[i],现有一个承重为m的背包,每个物品要么拿一个,要么不拿,问背包能装下的最大价值。 2.1 二维数组 直观的动态规划是二维数组 dp[i][j]表示在下标为0-i的物品中选择,且背包承重为j时的最大价值 最后要求 阅读全文
posted @ 2022-02-23 11:53 livingsu 阅读(24) 评论(0) 推荐(0) 编辑
摘要:贪心思想:尽量在父节点上放摄像头 用后序遍历,三种状态: 0: 无摄像头,并且没被覆盖 -1: 无摄像头,且被覆盖了 1: 有摄像头 class Solution { int num=0; public int minCameraCover(TreeNode root) { if(postOrder 阅读全文
posted @ 2022-02-22 17:38 livingsu 阅读(24) 评论(0) 推荐(0) 编辑
摘要:贪心: 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[ 阅读全文
posted @ 2022-02-22 13:42 livingsu 阅读(23) 评论(0) 推荐(0) 编辑
摘要:class Solution { public int monotoneIncreasingDigits(int n) { char[] arr=Integer.toString(n).toCharArray(); int len=arr.length; int k=len; for(int i=l 阅读全文
posted @ 2022-02-22 13:18 livingsu 阅读(20) 评论(0) 推荐(0) 编辑
摘要:class Solution { public int eraseOverlapIntervals(int[][] intervals) { Arrays.sort(intervals,(a,b)->a[1]-b[1]); int n=intervals.length; int right=inte 阅读全文
posted @ 2022-02-21 21:05 livingsu 阅读(21) 评论(0) 推荐(0) 编辑
摘要:将数组排序:按照h降序,h相同的按照k升序。然后,遍历,并按照k,进行下标插入。 class Solution { public int[][] reconstructQueue(int[][] people) { Arrays.sort(people,(a,b)->{ if(a[0]!=b[0]) 阅读全文
posted @ 2022-02-21 20:02 livingsu 阅读(14) 评论(0) 推荐(0) 编辑
摘要:将数组按照绝对值的方法排序,从后往前,把绝对值大的负数变正即可。 java中自定义排序int[]比较麻烦,故我用的直接排序,用两个指针比较绝对值遍历。 class Solution { public int largestSumAfterKNegations(int[] nums, int k) { 阅读全文
posted @ 2022-02-20 15:50 livingsu 阅读(18) 评论(0) 推荐(0) 编辑
摘要:解法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 阅读全文
posted @ 2022-02-19 13:47 livingsu 阅读(21) 评论(0) 推荐(0) 编辑
摘要: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; 阅读全文
posted @ 2022-02-19 13:08 livingsu 阅读(24) 评论(0) 推荐(0) 编辑
摘要:用深搜dfs,返回值boolean表示找到了。 class Solution { public void solveSudoku(char[][] board) { dfs(board); } boolean dfs(char[][] board){ for(int i=0;i<9;i++){ fo 阅读全文
posted @ 2022-02-19 11:59 livingsu 阅读(27) 评论(0) 推荐(0) 编辑
摘要:去重:先排序,然后判断当前层中,前一个值是否没被用,且和现在遍历的节点值相同。 比如[1,1,1,2],第一次选1,第二层中,第一个1可以选,第2个1不能选。 class Solution { List<List<Integer>> ans=new ArrayList<>(); List<Integ 阅读全文
posted @ 2022-02-18 17:41 livingsu 阅读(20) 评论(0) 推荐(0) 编辑
摘要:用一个boolean数组记录是否被使用。 class Solution { List<List<Integer>> ans=new ArrayList<>(); List<Integer> cur=new ArrayList<>(); boolean[] used; public List<List 阅读全文
posted @ 2022-02-18 17:29 livingsu 阅读(12) 评论(0) 推荐(0) 编辑
摘要:一、题目 二、解法 问题在于去重。由于不能排序,不能简单的比较前一个值。所以应该用set来判断当前层中,之前遍历过的节点里是否包含现在正在遍历的节点。 class Solution { List<List<Integer>> ans=new ArrayList<>(); List<Integer> 阅读全文
posted @ 2022-02-18 17:22 livingsu 阅读(22) 评论(0) 推荐(0) 编辑
摘要:一、题目 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1: 输入:nums = [1,2,3] 输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]] 阅读全文
posted @ 2022-02-18 16:56 livingsu 阅读(16) 评论(0) 推荐(0) 编辑
摘要:lab2 bomb笔记 GDB 打断点: break explode_bomb 在断点处停止运行: kill 把答案放在文件a中,在gdb中只需 run a 即可输入之前的正确答案。 start 反汇编二进制文件bomb,将汇编代码输出到assembly文件: objdump -d bomb >as 阅读全文
posted @ 2022-02-18 15:25 livingsu 阅读(55) 评论(0) 推荐(0) 编辑
摘要:一、题目 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 示例 1: 输入:s = "aab" 输出:[["a","a","b"],["aa","b"]] 二、解法 思路:回溯。 其中需要判断s[i: 阅读全文
posted @ 2022-02-17 14:51 livingsu 阅读(15) 评论(0) 推荐(0) 编辑
摘要:一、题目 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1: 输入:n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] 二、解法 剪枝:i<=n-(k- 阅读全文
posted @ 2022-02-17 11:17 livingsu 阅读(14) 评论(0) 推荐(0) 编辑
摘要:一、题目 给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。 二、解法 反向中序遍历: class Solution { int sum=0; public Tre 阅读全文
posted @ 2022-02-16 15:54 livingsu 阅读(21) 评论(0) 推荐(0) 编辑
摘要:递归: class Solution { public TreeNode trimBST(TreeNode root, int low, int high) { if(root==null) return root; if(root.val<low) return trimBST(root.righ 阅读全文
posted @ 2022-02-16 15:30 livingsu 阅读(20) 评论(0) 推荐(0) 编辑
摘要:一、题目 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。 一般来说,删除节点可分为两个步骤: 首先找到需要删除的节点; 如果找到了,删除它。 二、解法 node表示找到的节点, 阅读全文
posted @ 2022-02-16 15:17 livingsu 阅读(18) 评论(0) 推荐(0) 编辑
摘要:本题与236. 二叉树的最近公共祖先非常像,但是本题是二叉搜索树,可以根据BST的性质,不需要全部遍历,只需要从上往下一次即可。 class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, Tree 阅读全文
posted @ 2022-02-15 20:01 livingsu 阅读(24) 评论(0) 推荐(0) 编辑
摘要:一、题目 给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。 如果树中有不止一个众数,可以按 任意顺序 返回。 假定 BST 满足如下定义: 结点左子树中所含节点的值 小于等于 当前节点的值 结点右子树中所含节点的值 大于等于 阅读全文
posted @ 2022-02-15 18:07 livingsu 阅读(26) 评论(0) 推荐(0) 编辑
摘要:解法: 递归:简单 class Solution { public TreeNode mergeTrees(TreeNode root1, TreeNode root2) { if(root1==null) return root2; if(root2==null) return root1; re 阅读全文
posted @ 2022-02-14 12:00 livingsu 阅读(18) 评论(0) 推荐(0) 编辑
摘要:一、题目 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。 叶子节点 是指没有子节点的节点。 二、解法 递归: c 阅读全文
posted @ 2022-02-14 11:26 livingsu 阅读(19) 评论(0) 推荐(0) 编辑
摘要:一、题目 输入: root = [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24 二、解法 class Solution { public int sumOfLeftLeaves(TreeNode root) { 阅读全文
posted @ 2022-02-13 17:28 livingsu 阅读(4) 评论(0) 推荐(0) 编辑
摘要:一、题目 输入:root = [1,2,3,4,5,6] 输出:6 二、解法 一般的做法是用bfs或dfs遍历节点,时间和空间复杂度是O(n)。 要利用完全二叉树这个性质,首先求出树的层数level(root是0层),然后二分查找,判断最高层节点是否存在。 /** * Definition for 阅读全文
posted @ 2022-02-13 16:51 livingsu 阅读(20) 评论(0) 推荐(0) 编辑
摘要:一、题目 给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明:叶子节点是指没有子节点的节点。 输入:root = [2,null,3,null,4,null,5,null,6] 输出:5 二、解法 递归: /** * Definition for a b 阅读全文
posted @ 2022-02-13 11:36 livingsu 阅读(25) 评论(0) 推荐(0) 编辑
摘要:后序遍历:左右中,和前序遍历(中左右)只差了一点,只需调整结果顺序和左右节点入栈顺序即可。 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNod 阅读全文
posted @ 2022-02-08 16:30 livingsu 阅读(28) 评论(0) 推荐(0) 编辑
摘要:思路:用两个队列,先放到s2中,然后把s1的全部放入s2中,再将s1和s2进行交换即可。 class MyStack { Deque<Integer> s1=new ArrayDeque<>(); Deque<Integer> s2=new ArrayDeque<>(); public MyStac 阅读全文
posted @ 2022-02-08 10:58 livingsu 阅读(23) 评论(0) 推荐(0) 编辑
摘要:一、题目 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。 示例 1: 输入: s = "abcdefg", k = 2 输出: "cdefgab 阅读全文
posted @ 2022-02-08 09:43 livingsu 阅读(20) 评论(0) 推荐(0) 编辑
摘要:一、题目 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 示例 1: 输入:s = ["h","e","l","l","o"] 输出:["o","l","l","e 阅读全文
posted @ 2022-02-07 21:09 livingsu 阅读(18) 评论(0) 推荐(0) 编辑
摘要:一、题目 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。 示例 3: 输入:head = [7,7,7,7], val = 7 输出:[] 二、解法 /** * Definition for singly- 阅读全文
posted @ 2022-02-07 16:31 livingsu 阅读(25) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示