【Leetcode】679. 24 Game

题目地址:

https://leetcode.com/problems/24-game/
给定四个整数,算 24 24 24点。

思路是DFS。每次挑两个数,然后从vector里删掉,分 6 6 6种情况将 a + b a+b a+b a − b a-b ab b − a b-a ba a ∗ b a*b ab a / b a/b a/b b / a b/a b/a加入vector,然后递归求解规模减 1 1 1的问题。当vector长度为 1 1 1的时候check一下结果是不是 24 24 24。需要注意,一定要用double类型来做,并且判断一个double是否等于 0 0 0,需要看其是否小于一个很小的数。代码如下:

class Solution {
 public:
  const double eps = 1e-9;
  bool judgePoint24(vector<int>& v) {
    vector<double> a(v.begin(), v.end());
    return dfs(a);
  }

  bool dfs(vector<double>& a) {
    if (a.size() == 1) return abs(a[0] - 24) < eps;
    for (int i = 0; i + 1 < a.size(); i++)
      for (int j = i + 1; j < a.size(); j++) {
        double x = a[i], y = a[j];
        a.erase(a.begin() + j);
        a.erase(a.begin() + i);

        a.push_back(x + y);
        if (dfs(a)) return true;
        a.back() = x - y;
        if (dfs(a)) return true;
        a.back() = y - x;
        if (dfs(a)) return true;
        a.back() = x * y;
        if (dfs(a)) return true;
        a.pop_back();
        if (abs(y) > eps) {
          a.push_back(x / y);
          if (dfs(a)) return true;
          a.pop_back();
        }
        if (abs(x) > eps) {
          a.push_back(y / x);
          if (dfs(a)) return true;
          a.pop_back();
        }

        a.insert(a.begin() + i, x);
        a.insert(a.begin() + j, y);
      }

    return false;
  }
};

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值