[Swift]LeetCode964. 表示数字的最少运算符 | Least Operators to Express Number

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:http://www.javashuo.com/article/p-rqfbfsob-me.html 
➤若是连接不是山青咏芝的博客园地址,则多是爬取做者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持做者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★html

Given a single positive integer x, we will write an expression of the form x (op1) x (op2) x (op3) x ... where each operator op1op2, etc. is either addition, subtraction, multiplication, or division (+-*, or /).  For example, with x = 3, we might write 3 * 3 / 3 + 3 - 3 which is a value of 3.git

When writing such an expression, we adhere to the following conventions:github

  1. The division operator (/) returns rational numbers.
  2. There are no parentheses placed anywhere.
  3. We use the usual order of operations: multiplication and division happens before addition and subtraction.
  4. It's not allowed to use the unary negation operator (-).  For example, "x - x" is a valid expression as it only uses subtraction, but "-x + x" is not because it uses negation.

We would like to write an expression with the least number of operators such that the expression equals the given target.  Return the least number of expressions used.express

Example 1:微信

Input: x = 3, target = 19 Output: 5 Explanation: 3 * 3 + 3 * 3 + 3 / 3. The expression contains 5 operations. 

Example 2:app

Input: x = 5, target = 501 Output: 8 Explanation: 5 * 5 * 5 * 5 - 5 * 5 * 5 + 5 / 5. The expression contains 8 operations. 

Example 3:spa

Input: x = 100, target = 100000000 Output: 3 Explanation: 100 * 100 * 100 * 100. The expression contains 3 operations.

Note:code

  • 2 <= x <= 100
  • 1 <= target <= 2 * 10^8

给定一个正整数 x,咱们将会写出一个形如 x (op1) x (op2) x (op3) x ... 的表达式,其中每一个运算符 op1op2,… 能够是加、减、乘、除(+-*,或是 /)之一。例如,对于 x = 3,咱们能够写出表达式 3 * 3 / 3 + 3 - 3,该式的值为 3 。orm

在写这样的表达式时,咱们须要遵照下面的惯例:htm

  1. 除运算符(/)返回有理数。
  2. 任何地方都没有括号。
  3. 咱们使用一般的操做顺序:乘法和除法发生在加法和减法以前。
  4. 不容许使用一元否认运算符(-)。例如,“x - x” 是一个有效的表达式,由于它只使用减法,可是 “-x + x” 不是,由于它使用了否认运算符。 

咱们但愿编写一个能使表达式等于给定的目标值 target 且运算符最少的表达式。返回所用运算符的最少数量。

示例 1:

输入:x = 3, target = 19
输出:5
解释:3 * 3 + 3 * 3 + 3 / 3 。表达式包含 5 个运算符。

示例 2:

输入:x = 5, target = 501
输出:8
解释:5 * 5 * 5 * 5 - 5 * 5 * 5 + 5 / 5 。表达式包含 8 个运算符。

示例 3:

输入:x = 100, target = 100000000
输出:3
解释:100 * 100 * 100 * 100 。表达式包含 3 个运算符。

提示:

  • 2 <= x <= 100
  • 1 <= target <= 2 * 10^8

100ms

 1 class Solution {
 2     var x:Int = 0
 3     var best:Int = 0
 4     func leastOpsExpressTarget(_ x: Int, _ target: Int) -> Int {
 5         var target  = target
 6         self.x = x
 7         var list:[Int] = [Int]()
 8         while(target != 0)
 9         {
10             list.append(target % x)
11             target /= x
12         }
13         self.best = Int.max
14         dfs(list, 0, 0, 0)
15         return best - 1
16     }
17     
18     func dfs(_ list:[Int],_ k:Int,_ add:Int,_ count:Int)
19     {
20         var add = add
21         if count >= best
22         {
23             return
24         }
25         if add == 0 && k >= list.count
26         {
27             best = min(best, count)
28             return
29         }
30         
31         if k < list.count
32         {
33             add += list[k]
34         }
35         var cost:Int = k == 0 ? 2 : k
36         var cur:Int = add % x
37         add /= x
38         dfs(list, k + 1, add, count + cost * cur)
39         if cur != 0 && k <= list.count + 2
40         {
41             dfs(list, k + 1, 1, count + cost * (x - cur))
42         }
43     }
44 }
相关文章
相关标签/搜索