剑指offer57 和为S的连续正数序列
思路
class Solution {
public int[][] findContinuousSequence(int target) {
List<int[]> result = new ArrayList<int[]>();
int sum = 0;
for(int l=1,r=2;l<r;){
sum = (l+r)*(r-l+1)/2;
if(sum==target){
int[] res = new int[r-l+1];
for(int i=l; i<=r; i++){
res[i-l] = i;
}
result.add(res);
l++;
}
else if(sum>target){
l++;
}
else{
r++;
}
}
int len = result.size();
int[][] a = new int[len][];
result.toArray(a);
return a;
}
}
力扣1013 将数组分成和相等的三个部分
class Solution {
public boolean canThreePartsEqualSum(int[] A) {
int sum = 0;
for(int i : A){
sum += i;
}
if(sum%3 != 0){
// 总和不是3的倍数,直接返回false
return false;
}
// 使用双指针,从数组两头开始一起找,节约时间
int left = 0;
int leftSum = A[left];
int right = A.length - 1;
int rightSum = A[right];
// 使用left + 1 < right 的原因,防止只能将数组分成两个部分
// 例如:[1,-1,1,-1],使用left < right作为判断条件就会出错
while(left + 1 < right){
if(leftSum == sum/3 && rightSum == sum/3){
// 左右两边都等于 sum/3 ,中间也一定等于
return true;
}
if(leftSum != sum/3){
// left = 0赋予了初值,应该先left++,在leftSum += A[left];
leftSum += A[++left];
}
if(rightSum != sum/3){
// right = A.length - 1 赋予了初值,应该先right--,在rightSum += A[right];
rightSum += A[--right];
}
}
return false;
}
}
力扣112 路径总和
/**
思路:当节点为空时,那么说明这条路没有
当节点没有子节点是,返回这个节点是不是和输入的目标差相同,相同则说明找到了满足条件的路径
当节点不为空时,将当前节点移动到它的左右子节点进行判断,同时输入的目标也应该减去当前节点的val
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public boolean hasPathSum(TreeNode root, int sum) {
if(root == null){
return false;
}
if(root.left == null && root.right == null){
return root.val == sum;
}
return hasPathSum(root.left, sum - root.val) || hasPathSum(root.right, sum - root.val);
}
}