কম্পিউটার টিউটোরিয়াল

পাইথনে সিটি স্কায়লাইন রক্ষা করে বিল্ডিং হাইট বাড়ানোর সর্বোচ্চ যোগফল


সমস্যা বিবরণ

একটি ২D গ্রিড দেওয়া আছে যেখানে grid[i][j] হলো (i, j) অবস্থানের বিল্ডিংয়ের উচ্চতা। আমরা যেকোনো বিল্ডিংয়ের উচ্চতা বাড়াতে পারি। কিন্তু চার দিক থেকে (উত্তর, দক্ষিণ, পূর্ব, পশ্চিম) দেখায় স্কায়লাইন (সর্বোচ্চ উচ্চতার আউটলাইন) অপরিবর্তিত থাকতে হবে। বিল্ডিং হাইট বাড়ানোর সর্বোচ্চ মোট যোগফল বের করতে হবে।

উদাহরণ

ইনপুট গ্রিড:

3084
2457
9236
0310

টপ/বটম স্কায়লাইন: [9, 4, 8, 7] (কলাম ভিত্তিক ম্যাক্স)

লেফট/রাইট স্কায়লাইন: [8, 7, 9, 3] (সারি ভিত্তিক ম্যাক্স)

আউটপুট: 35

ফাইনাল গ্রিড (স্কায়লাইন রক্ষা করে):

8487
7477
9487
3333

সমাধানের কৌশল

প্রতিটি সেল (i, j) এর সর্বোচ্চ সম্ভাব্য উচ্চতা হলো min(row_max[i], col_max[j])। কারণ এই সেলটি তার সারি ও কলামের স্কায়লাইন অতিক্রম করতে পারবে না।

অ্যালগরিদম

  1. প্রতিটি সারির ম্যাক্সimum বের করে row_max অ্যারে বানান
  2. প্রতিটি কলামের ম্যাক্সimum বের করে col_max অ্যারে বানান
  3. প্রতিটি সেল (i, j) এর জন্য:
    • নতুন উচ্চতা = min(row_max[i], col_max[j])
    • বৃদ্ধি = নতুন উচ্চতা - পুরনো উচ্চতা
    • সর্বমোট বৃদ্ধিতে যোগ করুন

পাইথন কোড

class Solution:
    def maxIncreaseKeepingSkyline(self, grid):
        # সারি ও কলাম ভিত্তিক ম্যাক্সimum বের করুন
        row_max = [max(row) for row in grid]
        col_max = [max(grid[i][j] for i in range(len(grid))) 
                   for j in range(len(grid[0]))]
        
        total_increase = 0
        for i in range(len(grid)):
            for j in range(len(grid[0])):
                max_allowed = min(row_max[i], col_max[j])
                total_increase += max_allowed - grid[i][j]
        
        return total_increase

ob = Solution()
grid = [[3,0,8,4],[2,4,5,7],[9,2,6,3],[0,3,1,0]]
print(ob.maxIncreaseKeepingSkyline(grid))  # আউটপুট: 35

জটিলতা বিশ্লেষণ

  • সময় জটিলতা: O(R × C) — R = সারি, C = কলাম
  • স্থান জটিলতা: O(R + C) — row_max ও col_max অ্যারে জন্য

মূল বিষয়বস্তু

  • স্কায়লাইন = প্রতিটি সারি/কলামের ম্যাক্সimum
  • সেলের সর্বোচ্চ উচ্চতা তার সারি ও কলামের ম্যাক্সimum এর মিনিমাম
  • গ্রিডি পদ্ধতিতে প্রতিটি সেল স্বতন্ত্রভাবে অপ্টিমাইজ করা যায়
  1. পাইথন: একটি লিস্টে সর্বোচ্চ মানের সূচক বের করা

  2. পাইথন ValueError: max() arg is an empty sequence সমাধান

  3. পাইথনে হিপ লিস্ট ম্যাক্স হিপ কিনা চেক করা

  4. পাইথনে অ্যারে থেকে সর্বোচ্চ এলিমেন্ট বের করা