算法日常训练11.4

 分析一波,target=1时   1  一步

target=2  1-2+3  三步

target=3  1+2  两步

target=4  -1+2 +3 三步

首先要知道正数与负数的步数是一样的,因为对称性,比如-2时可以-1+2-3,方向相反就是了,所以可以把所有问题换成正数分析

第一想法是回溯,每个数字都有加和减两个状态,回溯一下就好了,但是看到取值范围为10的9次方,这种想法直接排除,那么dp,没找到什么关系,只能从题目找规律。

target等于6时,是3步能走的最远距离,就是1+2+3,发现-1+2+3是4,1-2+3是2,所以这些数可以看成1+2+3中反转一个数,反转1就少了2步,反转2就少了4步,一定是偶数,所以当sum>target时,如果sum-target为偶数,那么sum反转一个数就能得到target,那么就是i步,如果是奇数,就要继续往下走,比如1+2-2=1,那么1+2就不能反转一个数得到2,所以继续看1+2+3。

class Solution {
    public int reachNumber(int target) {
        target=Math.abs(target);//由于对称性,正数和负数都是一样的
        int sum=0;
        int i=1;
        while(true){
            sum+=i;
            if(sum==target)//恰好走到target
            return i;
            if(sum>target&&(sum-target)%2==0)//走到可以反转一个数就相同的位置就是i次
            return i;
            i++;
        }
    }
}

 一个简单的递归,首先确定终止条件,值不相同,只存在一方,就是false,递归到底下都是null,就是true,第一层判断左子树和右子树是否相等,后面判断左子树的左子树和右子树的右子树,左子树的右子树和右子树的左子树是否相等,就这样递归下去,为什么要这样比,画一个树的轴对称就能理解了

class Solution {
    public boolean isSymmetric(TreeNode root) {
        if(root==null) return true;//空树
        return backtracking(root.left,root.right);//比较左右子树
    }
    public boolean backtracking(TreeNode left,TreeNode right){
        if(right==null&&left==null) return true;//左右都为空返回true
        if(right==null&&left!=null||left==null&&right!=null) return false;//只有一个为空返回fasle
        if(left.val!=right.val) return false;//值不相等返回false
        
        return backtracking(left.left,right.right)&&backtracking(left.right,right.left);//继续往下判断子树是否相同
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值