Welcome to Subscribe On Youtube
2059. Minimum Operations to Convert Number
Description
You are given a 0-indexed integer array nums
containing distinct numbers, an integer start
, and an integer goal
. There is an integer x
that is initially set to start
, and you want to perform operations on x
such that it is converted to goal
. You can perform the following operation repeatedly on the number x
:
If 0 <= x <= 1000
, then for any index i
in the array (0 <= i < nums.length
), you can set x
to any of the following:
x + nums[i]
x - nums[i]
x ^ nums[i]
(bitwise-XOR)
Note that you can use each nums[i]
any number of times in any order. Operations that set x
to be out of the range 0 <= x <= 1000
are valid, but no more operations can be done afterward.
Return the minimum number of operations needed to convert x = start
into goal
, and -1
if it is not possible.
Example 1:
Input: nums = [2,4,12], start = 2, goal = 12 Output: 2 Explanation: We can go from 2 → 14 → 12 with the following 2 operations. - 2 + 12 = 14 - 14 - 2 = 12
Example 2:
Input: nums = [3,5,7], start = 0, goal = -4 Output: 2 Explanation: We can go from 0 → 3 → -4 with the following 2 operations. - 0 + 3 = 3 - 3 - 7 = -4 Note that the last operation sets x out of the range 0 <= x <= 1000, which is valid.
Example 3:
Input: nums = [2,8,16], start = 0, goal = 1 Output: -1 Explanation: There is no way to convert 0 into 1.
Constraints:
1 <= nums.length <= 1000
-109 <= nums[i], goal <= 109
0 <= start <= 1000
start != goal
- All the integers in
nums
are distinct.
Solutions
BFS.
-
class Solution { public int minimumOperations(int[] nums, int start, int goal) { IntBinaryOperator op1 = (x, y) -> x + y; IntBinaryOperator op2 = (x, y) -> x - y; IntBinaryOperator op3 = (x, y) -> x ^ y; IntBinaryOperator[] ops = {op1, op2, op3}; boolean[] vis = new boolean[1001]; Queue<int[]> queue = new ArrayDeque<>(); queue.offer(new int[] {start, 0}); while (!queue.isEmpty()) { int[] p = queue.poll(); int x = p[0], step = p[1]; for (int num : nums) { for (IntBinaryOperator op : ops) { int nx = op.applyAsInt(x, num); if (nx == goal) { return step + 1; } if (nx >= 0 && nx <= 1000 && !vis[nx]) { queue.offer(new int[] {nx, step + 1}); vis[nx] = true; } } } } return -1; } }
-
class Solution { public: int minimumOperations(vector<int>& nums, int start, int goal) { using pii = pair<int, int>; vector<function<int(int, int)>> ops{ [](int x, int y) { return x + y; }, [](int x, int y) { return x - y; }, [](int x, int y) { return x ^ y; }, }; vector<bool> vis(1001, false); queue<pii> q; q.push({start, 0}); while (!q.empty()) { auto [x, step] = q.front(); q.pop(); for (int num : nums) { for (auto op : ops) { int nx = op(x, num); if (nx == goal) { return step + 1; } if (nx >= 0 && nx <= 1000 && !vis[nx]) { q.push({nx, step + 1}); vis[nx] = true; } } } } return -1; } };
-
class Solution: def minimumOperations(self, nums: List[int], start: int, goal: int) -> int: op1 = lambda x, y: x + y op2 = lambda x, y: x - y op3 = lambda x, y: x ^ y ops = [op1, op2, op3] vis = [False] * 1001 q = deque([(start, 0)]) while q: x, step = q.popleft() for num in nums: for op in ops: nx = op(x, num) if nx == goal: return step + 1 if 0 <= nx <= 1000 and not vis[nx]: q.append((nx, step + 1)) vis[nx] = True return -1
-
func minimumOperations(nums []int, start int, goal int) int { type pair struct { x int step int } ops := []func(int, int) int{ func(x, y int) int { return x + y }, func(x, y int) int { return x - y }, func(x, y int) int { return x ^ y }, } vis := make([]bool, 1001) q := []pair{ {start, 0} } for len(q) > 0 { x, step := q[0].x, q[0].step q = q[1:] for _, num := range nums { for _, op := range ops { nx := op(x, num) if nx == goal { return step + 1 } if nx >= 0 && nx <= 1000 && !vis[nx] { q = append(q, pair{nx, step + 1}) vis[nx] = true } } } } return -1 }
-
function minimumOperations(nums: number[], start: number, goal: number): number { const n = nums.length; const op1 = function (x: number, y: number): number { return x + y; }; const op2 = function (x: number, y: number): number { return x - y; }; const op3 = function (x: number, y: number): number { return x ^ y; }; const ops = [op1, op2, op3]; let vis = new Array(1001).fill(false); let quenue: Array<Array<number>> = [[start, 0]]; vis[start] = true; while (quenue.length) { let [x, step] = quenue.shift(); for (let i = 0; i < n; i++) { for (let j = 0; j < ops.length; j++) { const nx = ops[j](x, nums[i]); if (nx == goal) { return step + 1; } if (nx >= 0 && nx <= 1000 && !vis[nx]) { vis[nx] = true; quenue.push([nx, step + 1]); } } } } return -1; }