iT邦幫忙

2023 iThome 鐵人賽

DAY 18
0
Software Development

30 天到底能寫多少 Leetcode系列 第 18

[Day18] 原本只是要複習 BFS 但順便學下雙向 BFS

  • 分享至 

  • xImage
  •  

進入圖論啦 (゚⊿゚)(゚⊿゚)(゚⊿゚)

今天看的是 2059. Minimum Operations to Convert Number,對於給定的 array,可以進行加減或 bitwise-XOR 操作,如果能算出 target number 就返回最小的計算數字。由於題目有限制,中間計算過程的數字必須在 0-1000 之間,因此可以把不在範圍內的中間數都排除掉。

BFS 的基本操作就是用 queue 去做 pop & append 來實現。另外,這題可以用 array 或 set 記下曾經走過的地方(因為求最小次數,找過的沒必要再重複找第二次,重複找不可能是答案),有點像在做剪枝的動作。

有了 BFS 概念,那雙向 BFS 呢?雙向其實就是同時從起點和終點做搜尋,會需要比較多的空間來儲存中間值。

class Solution:
    def minimumOperations(self, nums: List[int], start: int, goal: int) -> int:
        arr1 = [-1 for _ in range(1001)]
        arr2 = [-1 for _ in range(1001)]
        q = [start]
        q2 = [goal]

        if start <= 1000 and start > 0:
            arr1[start] = 0
        
        curr = 1
        tmp_ans = 1005

        while q:
            n = len(q)
            n2 = len(q2)

            for i in range(n):
                tmp = q.pop(0)

                for j in nums:
                    tmp2 = [tmp+j, tmp-j, tmp^j]
                    for k in tmp2:
                        if k == goal:
                            return curr
                        if k > 1000 or k < 0:
                            continue
                        if arr2[k] > 0:
                            tmp_ans = min(tmp_ans, arr2[k]+curr)
                        if arr1[k] == -1:
                            arr1[k] = curr
                            q.append(k)
            
            if tmp_ans < 1005:
                return tmp_ans

            for i in range(n2):
                tmp = q2.pop(0)
                for j in nums:
                    tmp3 = [tmp+j, tmp-j, tmp^j]
                    for k in tmp3:
                        if k <= 1000 and k >= 0 and arr2[k] == -1:
                            arr2[k] = curr
                            q2.append(k)

            curr += 1

        return -1


上一篇
[Day17] 用有點陰影的 bitmask 作為 DP 的結尾
下一篇
[Day19] 複習圖論的第二天看看 DFS
系列文
30 天到底能寫多少 Leetcode21
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言