মান লক্ষ্য করুন আমাদের কাছে একটি সংখ্যার তালিকা nums আছে এবং আমরা বর্তমানে nums[0]-এ আছি। প্রতিটি স্টেপে আমরা বর্তমান ইনডেক্স i থেকে i+1 বা i-1 বা j (যেখানে nums[i] == nums[j]) এ জাম্প করতে পারি। আমাদের কাজ হল ফাইনাল ইনডেক্সে পৌঁছানোর ন্যূনতম স্টেপ সংখ্যা বের করা।
উদাহরণস্বরূপ, যদি ইনপুট হয় nums = [4, 8, 8, 5, 4, 6, 5], তবে আউটপুট হবে 3, কারণ আমরা ইনডেক্স ০ থেকে ৪ এ জাম্প করতে পারি (দুটির মান ৪)। তারপর ইনডেক্স ৩ এ ফিরে যাই। তারপর ইনডেক্স ৩ থেকে ৬ এ জাম্প করতে পারি (দুটির মান ৫)।
pos := defaultdict(list)(ইনডেক্স স্টোর করার ম্যাপ)- প্রতিটি ইনডেক্স
iএবং ভ্যালুnএর জন্যnums-এ:iকেpos[n]-র শেষে ঢুকান।
n := len(nums)visited := [False] * n,visited[0] := Trueq := deque([(0, 0)])(BFS কিউ)qখালি না হওয়া পর্যন্ত লুপ চালান:(u, d) := q.popleft()- যদি
u == n-1হয়, তবেdরিটার্ন করুন। pos[nums[u]] + [u-1, u+1]এর প্রতিটিvএর জন্য:- যদি
0 <= v < nএবংnot visited[v]হয়, তবে:visited[v] := Trueq.append((v, d+1))
- যদি
del pos[nums[u]](ভিজিটেড ভ্যালুর ইনডেক্স লিস্ট ডিলিট করে রিডান্ডেন্সি কমাতে)
class Solution:
def solve(self, nums):
from collections import defaultdict, deque
pos = defaultdict(list)
for i, n in enumerate(nums):
pos[n].append(i)
q = deque([(0, 0)])
n = len(nums)
visited = [False] * n
visited[0] = True
while q:
u, d = q.popleft()
if u == n - 1:
return d
for v in pos[nums[u]] + [u - 1, u + 1]:
if 0 <= v < n and not visited[v]:
visited[v] = True
q.append((v, d + 1))
del pos[nums[u]]
return -1
ob = Solution()
nums = [4, 8, 8, 5, 4, 6, 5]
print(ob.solve(nums))
[4, 8, 8, 5, 4, 6, 5]
3