Integer Replacement

1. 解析

题目大意, 输入一个正整数,按照一定的步骤将其缩小为1,如果当前为偶数,则折半;如果当前的奇数,将其加1或者减1,求解缩小为1所经过的最少步骤。

2. 分析

如果当前数为偶数,折半即可,若为奇数,可以做两种不同的操作,要么减1要么加1;很明显我们要一直往下搜索目标,由于还存在不同的选择,故需要回溯到之前的状态,用深搜DFS无非是最合适的。如果n = INT_MAX,则n+1会超出整形的表示范围,所以我们单独进行处理即可。按照上面的操作还是比较容易写出对应的DFS表达式的,详见代码。

class Solution {
public:
    int integerReplacement(int n) {
        if (n == 1) return 0; 
        if (n % 2 == 0){ //偶数
            return integerReplacement(n/2) + 1;
        }
        else{ //奇数
            if (n == INT_MAX) //为了防止n+1超出整形的表示范围,单独处理,也可以先转换成long型
                return integerReplacement(n/2-1) + 1;
            return min(integerReplacement(n+1) + 1, integerReplacement(n-1) + 1);
        }
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值