## 剑指offer57 和为S的连续正数序列、## 力扣112 路径总和

剑指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);
        
    }
}


猜你喜欢

转载自blog.csdn.net/qq_40310710/article/details/113250579
今日推荐