【Leetcode】679. 24 Game

题目地址:

https://leetcode.com/problems/24-game/
2424点。直接用回溯法来做。每次挑两个数,然后从list里删掉,分66种情况将a+ba+baba-bbab-aaba*ba/ba/bb/ab/a加入list,然后递归求解规模减11的问题。当list长度为11的时候check一下结果是不是2424。只需要注意,一定要用double类型来做,就可以了。代码不难:

import java.util.ArrayList;
import java.util.List;

public class Solution {   
    public boolean judgePoint24(int[] nums) {
        List<Double> list = new ArrayList<>();
        for (int num : nums) {
            list.add((double) num);
        }
        
        return helper(list);
    }
    
    private boolean helper(List<Double> list) {
        if (list.size() == 1 && isZero(list.get(0) - 24)) {
            return true;
        }
    
        for (int i = 0; i < list.size(); i++) {
            for (int j = i + 1; j < list.size(); j++) {
            	// 从list删掉两个数,对它们做运算再加入list
                double x = list.remove(j);
                double y = list.remove(i);
                // 尝试加法
                list.add(x + y);
                if (helper(list)) {
                    return true;
                }
                // 尝试完恢复原状,以便尝试别的运算
                list.remove(list.size() - 1);
    
                list.add(x - y);
                if (helper(list)) {
                    return true;
                }
                list.remove(list.size() - 1);
    
                list.add(y - x);
                if (helper(list)) {
                    return true;
                }
                list.remove(list.size() - 1);
    
                list.add(x * y);
                if (helper(list)) {
                    return true;
                }
                list.remove(list.size() - 1);
                
                if (!isZero(y)) {
                    list.add(x / y);
                    if (helper(list)) {
                        return true;
                    }
                    list.remove(list.size() - 1);
                }
                if (!isZero(x)) {
                    list.add(y / x);
                    if (helper(list)) {
                        return true;
                    }
                    list.remove(list.size() - 1);
                }
                // 上面的运算都尝试过以后,需要将y和x分别加回,
                // 恢复原状,然后尝试下一对数字
                list.add(i, y);
                list.add(j, x);
            }
        }
        
        return false;
    }
    
    private boolean isZero(double x) {
        return Math.abs(x) < 1e-5;
    }
}

设list长度为nn,空间复杂度O(n)O(n),时间复杂度设为T(n)T(n),则满足递推式:T(n)=6T(n1)T(0)=1T(n)=6T(n-1)\\T(0)=1所以T(n)=O(6n)T(n)=O(6^n)

发布了87 篇原创文章 · 获赞 0 · 访问量 1355
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览