分析一波,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);//继续往下判断子树是否相同
}
}