var pruneTree = function(root) {
if (!root) {
return null
}
root.left = pruneTree(root.left)
root.right = pruneTree(root.right)
if (!root.left && !root.right&& root.val === 0) {
return null
}
return root
};
var minimumTotal = function(triangle) {
let l=triangle.length
const dp=new Array(l).fill(0).map(()=>new Array(l).fill(0))
dp[0][0]=triangle[0][0]
for(let i=1
dp[i][0]=dp[i-1][0]+triangle[i][0]
}
for(let i=1
for(let j=1
dp[i][j]=Math.min(dp[i-1][j],dp[i-1][j-1])+triangle[i][j]
}
dp[i][i]=dp[i-1][i-1]+triangle[i][i]
}
return Math.min(...dp[l-1])
}
var canPartition = function(nums) {
if(nums.length<2){
return false
}
let sum=nums.reduce((a,b)=>a+b,0)
if(sum%2!==0){
return false
}
if(Math.max(...nums)>sum/2){
return false
}
const dp=new Array(nums.length).fill(false).map(()=>new Array(sum/2+1).fill(false))
for(let i=0;i<nums.length;i++){
dp[i][0]=true
}
dp[0][nums[0]]=true
for(let i=1;i<nums.length;i++){
for(let j=1;j<sum/2+1;j++){
if(nums[i]>j){
dp[i][j]=dp[i-1][j]
}else{
dp[i][j]=(dp[i-1][j] || dp[i-1][j-nums[i]])
}
}
}
return dp[nums.length-1][sum/2]
};
var findTargetSumWays = function(nums, target) {
let sum=nums.reduce((a,b)=>a+b,0)
if(sum-target<0 || (sum-target)%2!==0){
return 0
}
let n=(sum-target)/2
const dp=new Array(nums.length+1).fill(0).map(()=>new Array(n+1).fill(0))
dp[0][0]=1
for(let i=1;i<nums.length+1;i++){
for(let j=0;j<n+1;j++){
if(nums[i-1]>j){
dp[i][j]=dp[i-1][j]
}else{
dp[i][j]=dp[i-1][j]+dp[i-1][j-nums[i-1]]
}
}
}
return dp[nums.length][n]
};