5916. 转化数字的最小运算数

本文介绍了一种使用广度优先搜索(BFS)解决力扣题目中寻找从特定起点到目标值最少操作次数的问题。代码中展示了如何避免重复搜索并检查边界条件,同时提供了检查、搜索和主要解决方案的函数。通过BFS遍历所有可能的操作(加、减、异或),找到达到目标值所需的最小步数。
摘要由CSDN通过智能技术生成

题目链接:力扣

思路:bfs暴力搜索即可。每一种情况都搜一遍,已经搜过的值标记一下,不要重复搜。越界的值也不需要继续往下搜哦~~~(好久没写bfs了,手生了,忘记标记一开始的start了~~注意一下,一开始的start也要标记一下,要不后面必然也会造成重复搜~~~造成结果错误~~~)

上代码:

class Solution {

    private val numMap = HashMap<Int, Boolean>()
    private val queue = LinkedList<Int>()
    private val dis = Array(1001) { 0 }

    private fun check(x: Int, goal: Int): Boolean {
        if (numMap.containsKey(x) || x != goal && (x < 0 || x > 1000)) {
            return false
        }
        return true
    }

    private fun seek(topValue: Int, value: Int, goal: Int): Int {
        if (check(value, goal)) {
            if (value == goal) {
                return dis[topValue] + 1
            } else {
                dis[value] = dis[topValue] + 1
                queue.add(value)
                numMap[value] = true
            }
        }
        return -2
    }

    fun minimumOperations(nums: IntArray, start: Int, goal: Int): Int {
        queue.add(start)
        dis[start] = 0
        numMap[start] = true
        while (queue.isNotEmpty()) {
            val topValue = queue.poll()
            if (topValue == goal) {
                return dis[topValue]
            }
            for (i in nums.indices) {
                val operationAdd = seek(topValue, topValue + nums[i], goal)
                if (operationAdd != -2) {
                    return operationAdd
                }
                val operationSub = seek(topValue, topValue - nums[i], goal)
                if (operationSub != -2) {
                    return operationSub
                }
                val operationXor = seek(topValue, topValue xor nums[i], goal)
                if (operationXor != -2) {
                    return operationXor
                }
            }
        }
        return -1
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心脏dance

如果解决了您的疑惑,谢谢打赏呦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值