LeetCode 2059. 轉化數字的最小運算數


LeetCode 2059. 轉化數字的最小運算數

題目描述

給你一個下標從 0 開始的整數數組 nums,該數組由 互不相同 的數字組成。另給你兩個整數 startgoal

整數 x 的值最開始設為 start,你打算執行一些運算使 x 轉化為 goal。你可以對數字 x 重復執行下述運算:

如果 0 <= x <= 1000,那么,對於數組中的任一下標 i0 <= i < nums.length),可以將 x 設為下述任一值:

  • x + nums[i]
  • x - nums[i]
  • x ^ nums[i](按位異或 XOR)

注意,你可以按任意順序使用每個 nums[i] 任意次。使 x 越過 0 <= x <= 1000 范圍的運算同樣可以生效,但該該運算執行后將不能執行其他運算。

返回將 x = start 轉化為 goal 的最小操作數;如果無法完成轉化,則返回 -1

樣例

輸入:nums = [1,3], start = 6, goal = 4
輸出:2
解釋:
可以按 6 -> 7 -> 4 的轉化路徑進行,只需執行下述 2 次運算:
- 6 ^ 1 = 7
- 7 ^ 3 = 4
輸入:nums = [2,4,12], start = 2, goal = 12
輸出:2
解釋:
可以按 2 -> 14 -> 12 的轉化路徑進行,只需執行下述 2 次運算:
- 2 + 12 = 14
- 14 - 2 = 12
輸入:nums = [3,5,7], start = 0, goal = -4
輸出:2
解釋:
可以按 0 -> 3 -> -4 的轉化路徑進行,只需執行下述 2 次運算:
- 0 + 3 = 3
- 3 - 7 = -4
注意,最后一步運算使 x 超過范圍 0 <= x <= 1000,但該運算仍然可以生效。
輸入:nums = [2,8,16], start = 0, goal = 1
輸出:-1
解釋:
無法將 0 轉化為 1。
輸入:nums = [1], start = 0, goal = 3
輸出:3
解釋:
可以按 0 -> 1 -> 2 -> 3 的轉化路徑進行,只需執行下述 3 次運算:
- 0 + 1 = 1 
- 1 + 1 = 2
- 2 + 1 = 3

限制

  • 1 <= nums.length <= 1000
  • -10^9 <= nums[i], goal <= 10^9
  • 0 <= start <= 1000
  • start != goal
  • nums 中的所有整數互不相同。

題解

(廣度優先遍歷) \(O(nS)\)

const int N = 1010;

class Solution {
private:
    int dis[N];

public:
    int minimumOperations(vector<int>& nums, int start, int goal) {
        for (int i = 0; i <= 1000; i++)
            dis[i] = INT_MAX;

        dis[start] = 0;

        queue<int> q;
        q.push(start);

        while (!q.empty()) {
            int x = q.front();
            q.pop();

            for (int t : nums) {
                vector<int> ys = {x + t, x - t, x ^ t};
                for (int y : ys) {
                    if (y == goal)
                        return dis[x] + 1;

                    if (y < 0 || y > 1000 || dis[y] <= dis[x] + 1)
                        continue;

                    dis[y] = dis[x] + 1;
                    q.push(y);
                }
            }
        }

        return -1;
    }
};


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM