LeetCode算法心得——求一个整数的惩罚数

大家好,我是晴天学长,这是一道常见方案数演变而来的题目,重点是要用已知条件去不断的剪枝操作哦!


1 )求一个数的惩罚数

2) .算法思路

  • 将数字转化为字符串,按照索引下标从小到大(从左往右)进行分割。每次遍历中切下一刀,获取当前分割所得到数字串(前半段),剩余的字符串(后半段)继续递归搜索。
  • 剪枝:如果当前分割得到的数字,加上前面累加计算得到的结果sum后,超出了 i ,那么说明当前这一刀分割后,累加统计得到的结果已经超出了i的大小范围,因此后面的位置都不需要再进行分割。
  • 举例:25×25=625。第一刀分割后得到62,而此时62大于25,因此无论是继续拿剩下数字串的5进行dfs递归,还是往后遍历第一刀切的位置(在5后面得到625),所得到的结果肯定都比62大,因此剪枝。

3).代码示例

public class 求一个整数的惩罚数 {
    public static void main(String[] args) {
        System.out.println(Solution.punishmentNumber(1000));
    }

    static class Solution {
        public static int punishmentNumber(int n) {
            int ans = 0;
            for (int i = 1; i <= n; i++) {
                int t = i * i;
                if (dfs(t + "", 0, i)) {
                    ans += t;
                }
            }
            return ans;
        }

        private static boolean dfs(String str, int index, int target) {
            if (index == str.length()) {
                return target == 0;
            }

            for (int i = index; i < str.length(); i++) {
                int curr = Integer.parseInt(str.substring(index, i + 1));
                // 减枝
                if (target - curr < 0) {
                    break;
                }
                if (dfs(str, i + 1, target - curr)) {
                    return true;
                }
            }
            return false;
        }
    }
}

4).总结

  • 剪枝的操作
  • 目前需要的结果

你可能感兴趣的:(算法,算法,leetcode,职场和发展)