日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【解题报告】Leecode 2059. 转化数字的最小运算数

發布時間:2024/2/28 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【解题报告】Leecode 2059. 转化数字的最小运算数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:https://leetcode-cn.com/problems/minimum-operations-to-convert-number/


題解匯總:https://zhanglong.blog.csdn.net/article/details/121071779


題目描述

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

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

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

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

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

示例 1:
輸入:nums = [1,3], start = 6, goal = 4
輸出:2
解釋:
可以按 6 → 7 → 4 的轉化路徑進行,只需執行下述 2 次運算:
6 ^ 1 = 7
7 ^ 3 = 4

示例 2:
輸入:nums = [2,4,12], start = 2, goal = 12
輸出:2
解釋:
可以按 2 → 14 → 12 的轉化路徑進行,只需執行下述 2 次運算:
2 + 12 = 14
14 - 2 = 12

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

示例 4:
輸入:nums = [2,8,16], start = 0, goal = 1
輸出:-1
解釋:
無法將 0 轉化為 1

示例 5:
輸入: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
-109 <= nums[i], goal <= 109
0 <= start <= 1000
start != goal
nums 中的所有整數互不相同


思路:BFS全量搜索即可,注意要輸出步數。

這里附上我測試時的完整可運行代碼


#include "iostream" #include "algorithm" #include "queue" #include "vector" #include "unordered_map"using namespace std;class Solution { public:int minimumOperations(vector<int>& nums, int start, int goal) {// queue,入start, while非空, 循環, 過0 or 1000則不入queue<int> q;// 哈希查找,去重unordered_map<int, int>um;q.push(start);int step = 0;while (!q.empty()) {int size = q.size();for (int j = 0; j < size; j++) { //int t = q.front();q.pop();if (t == goal) {return step;}for (auto i : nums) {if ((t + i == goal) || (t - i == goal) || ((t^i) == goal)) {return step + 1;}// 加法if((t + i >= 0 && t + i <= 1000) && um[t+i] == 0) {q.push(t + i);um[t+i] = 1;}// 減法if((t - i >= 0 && t - i <= 1000) && um[t-i] == 0) {q.push(t - i);um[t-i] = 1;}// 異或if(((t ^ i) >= 0 && (t ^ i) <= 1000) && um[t^i] == 0) {q.push(t ^ i);um[t^i] = 1;}}}step++;}return -1;} };int main() {Solution solution;vector<int> v;v.push_back(2);v.push_back(4);v.push_back(12);cout << solution.minimumOperations(v, 2, 12);return 0; }

?????????????——弱小和無知不是生存的障礙,傲慢才是。

總結

以上是生活随笔為你收集整理的【解题报告】Leecode 2059. 转化数字的最小运算数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。