Leetcode416:分割等和子集
-
题目:给你一个 只包含正整数 的 非空 数组
nums。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 -
思路:0-1背包问题
-
代码如下:
class Solution {
public boolean canPartition(int[] nums) {
//长度为0或者空数组,不可能分割等和子集
if (nums.length==0||nums==null){
return false;
}
int sum = 0;
for (int num : nums){
sum += num;
}
int target = sum/2;
//总和为奇数,不可能分割等和子集
if (sum%2!=0){
return false;
}
//定义一维数组,dp[i]表示 背包总容量是i,最大可以凑成j的子集总和为dp[i]
int[] dp = new int[target+1];
for (int i = 0;i< nums.length;i++){
for(int j = target;j>=nums[i];j--){
dp[j] = Math.max(dp[j-nums[i]]+nums[i],dp[j]);
}
}
return dp[target]==target;
}
}
Leetcode1305:两棵二叉搜索树中的所有元素
- 题目:给你
root1和root2这两棵二叉搜索树。请你返回一个列表,其中包含 两棵树 中的所有整数并按 升序 排序。 - 思路:遍历两棵二叉树(中序遍历排序),然后收集到两个数组l1和l2,最后将两个数组l1和l2进行归并排序成结果数组res。
- 代码如下:
class Solution {
//存放比较时的最大值(为归并排序准备的最大值)
int INF = 0x3f3f3f3f;
public List<Integer> getAllElements(TreeNode root1, TreeNode root2) {
//存放最终结果数组
List<Integer> res = new ArrayList<>();
//存放完成升序排序的root1 线性数组
List<Integer> l1 = new ArrayList<>();
//存放完成升序排序的root2 线性数组
List<Integer> l2 = new ArrayList<>();
//将二叉树树型结构转换为线性结构
dfs(root1,l1);
dfs(root2,l2);
int i = 0, j = 0, n = l1.size(), m = l2.size();
//对数组l1和l2进行升序排序(归并排序)
while (i < n || j < m){
int a = i < n ? l1.get(i) : INF;
int b = j < m ? l2.get(j) : INF;
if(a < b){
res.add(a);
i++;
}else{
res.add(b);
j++;
}
}
return res;
}
//中序遍历排序
void dfs(TreeNode root,List<Integer> list){
if(root == null){
return ;
}
dfs(root.left,list);
list.add(root.val);
dfs(root.right,list);
}
}
本文介绍了如何运用动态规划方法解决LeetCode416题,即判断数组能否分割成两个和相等的子集。同时,展示了如何通过中序遍历与归并排序解决LeetCode1305题,合并两棵二叉搜索树中的所有元素。涉及到的技术包括0-1背包问题、二叉树遍历和排序算法。
259

被折叠的 条评论
为什么被折叠?



