• leetcode 679 24点游戏


     思路参考官方

     其实就是先找出来两个数,然后根据运算符的不同计算出二者结果后,再把二者结果和剩余的两个刚才没找出来的数进行后续计算,这里就可以采用递归了,从三个里选两个。到最后就只剩一个计算结果了。然后判断是否为24。

    从4个里选2个的排列有12个,然后计算符又有四种,所以12×4,然后针对这每一种结果,从三个里选2个的排列,是6种,然后计算符也是4种,再乘6×4,最后剩下两个元素,有两个排列,所以再乘2×4.即为上面所说的一共9216种可能。当然这是最多的可能,因为对于乘法和加法计算的二者顺序不影响。

    以下为java版本实现,以C++实现同样的思路但就是提示内存超了,没解决。

    class Solution {
        public boolean judgePoint24(int[] nums) {
            ArrayList A = new ArrayList<Double>();
            for (int v: nums) A.add((double) v);
            return solve(A);
        }
        private boolean solve(ArrayList<Double> nums) {
            if (nums.size() == 0) return false;
            if (nums.size() == 1) return Math.abs(nums.get(0) - 24) < 1e-6;
    
            for (int i = 0; i < nums.size(); i++) {
                for (int j = 0; j < nums.size(); j++) {
                    if (i != j) {
                        ArrayList<Double> nums2 = new ArrayList<Double>();
                        for (int k = 0; k < nums.size(); k++) if (k != i && k != j) {
                            nums2.add(nums.get(k));
                        }
                        for (int k = 0; k < 4; k++) {
                            if (k < 2 && j > i) continue;  //顺序不影响的计算一次即可
                            if (k == 0) nums2.add(nums.get(i) + nums.get(j));
                            if (k == 1) nums2.add(nums.get(i) * nums.get(j));
                            if (k == 2) nums2.add(nums.get(i) - nums.get(j));
                            if (k == 3) {
                                if (nums.get(j) != 0) {
                                    nums2.add(nums.get(i) / nums.get(j));
                                } else {
                                    continue;
                                }
                            }
                            if (solve(nums2)) return true;
                            nums2.remove(nums2.size() - 1);
                        }
                    }
                }
            }
            return false;
        }
    }
    #include<cmath>
    class Solution {
    public:
        bool judgePoint24(vector<int>& nums) {
          vector<double> num1;
          int l=nums.size();
          for(int i=0;i<l;i++)
          {
              num1.push_back(nums[i]);
          }
          return judge(num1);
        }
        bool judge(vector<double>& nums)
        {
            if(nums.size()==0) return false;
            else if (nums.size()==1)
            {
                if(fabs(nums[0]-24)<0.000001)
                    return true;
            }
            else
            {
            for(int i=0;i<nums.size();i++)
            {
                for(int j=0;j<nums.size();j++)
                {
                    vector<double> temp;
                    if(i!=j)
                    {
                         for(int k=0;k<nums.size();k++)
                         {
                             if(k!=i && k!=j)
                             {
                                  temp.push_back(nums[k]);
                             }
                         }
                         for(int k=0;k<4;k++)
                         {
                             if(k<2 && j<i) continue;
                             else if(k==0)
                             {
                                 temp.push_back(nums[i]+nums[j]);
                             }
                              else if(k==1)
                             {
                                 temp.push_back(nums[i]*nums[j]);
                             }
                              else if(k==2)
                             {
                                 temp.push_back(nums[i]-nums[j]);
                             }
                              else if(k==3)
                             {
                                 if(nums[j]!=0)
                                 {
                                    temp.push_back(nums[i]/(nums[j]));
                                 }
                                 else
                                       continue;
                                 
                             }
                         }
                         if(judge(temp))
                         {
                             return true;
                         }
                         temp.pop_back();
                    }
                }
            }
            }
            return false;
        }
    };
  • 相关阅读:
    HDU 4738——Caocao's Bridges——————【求割边/桥的最小权值】
    POJ 3177——Redundant Paths——————【加边形成边双连通图】
    亲历:IT 从业者避免猝死攻略 v1.0
    Linux如何统计进程的CPU利用率
    gcp – 源于CP的高级命令行文件拷贝工具
    丰田栽了的原因,嵌入式软件工程师都该看看
    四件在我步入职业软件开发生涯那天起就该知道的事情
    浅谈自底向上的Shell脚本编程及效率优化
    实用硬件产品集锦
    [置顶] openHAB 体系结构与编程模型 (1) --- 术语
  • 原文地址:https://www.cnblogs.com/libin123/p/13271869.html
Copyright © 2020-2023  润新知