每日一题-力扣(leetcode)2059. 转化数字的最小运算数

给定一个由不同整数组成的数组nums和两个整数start、goal,通过执行加、减、异或运算来尝试将start转换为目标值goal。文章提供了几个示例展示如何计算达到goal所需的最小操作数,并提到在某些情况下可能无法完成转化。算法思路是利用广度优先搜索(BFS)解决最短路径问题。
摘要由CSDN通过智能技术生成

传送门

题目描述

给你一个下标从 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 = [2,4,12], start = 2, goal = 12
输出:2
解释:
可以按 21412 的转化路径进行,只需执行下述 2 次运算:
- 2 + 12 = 14
- 14 - 2 = 12
示例2:
输入:nums = [3,5,7], start = 0, goal = -4
输出:2
解释:
可以按 03-4 的转化路径进行,只需执行下述 2 次运算:
- 0 + 3 = 3
- 3 - 7 = -4
注意,最后一步运算使 x 超过范围 0 <= x <= 1000 ,但该运算仍然可以生效。
示例 3:
输入:nums = [2,8,16], start = 0, goal = 1
输出:-1
解释:
无法将 0 转化为 1

在这里插入图片描述

算法思路:

这题一开始想复杂了,直接上手就dfs,,同时也没注意到 “x 越过 0 <= x <= 1000 范围的运算同样可以生效,但该该运算执行后将不能执行其他运算。” 这个条件,所以导致我卡了很久一直超时没跑过去,最后参考了一位大佬的解法,才顺利AC出来。
看到最短路径、最小次数这类问题,应当考虑BFS,然后这道题就变成了从start到goal的最短路径问题,然后我们用set记录一下已访问的数,防止重复访问,然后遇到不是在0 - 1000 内的数就不用push到queue中。

AC代码如下:

class Solution {
public:
    
    int minimumOperations(vector<int>& nums, int start, int goal) {
        queue<int>q;
        set<int>visited;
        q.push(start);
        int ans = 0;
        while(!q.empty()) {
            int length = q.size();
            for(int i = 0; i < length; i++) {
                int top = q.front();
                q.pop();
                if(top == goal) return ans;
                if(top < 0 || top > 1000 || visited.count(top) != 0) continue;
                for(auto i : nums) {
                    q.push(top + i);
                    q.push(top - i);
                    q.push(top ^ i);
                }
                visited.insert(top);
            }
            ans++;
        }
        return -1;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值