মূল কনটেন্টে যান
🧩
লোকাল DSA
প্যাটার্নটপিক 2 · Binary Search

2.4 Bitonic / Rotated Array

চিনবেন কীভাবে
"rotated sorted array", "peak/mountain element", "bitonic" — array পুরো sorted না হলেও অর্ধেকটা সবসময় sorted, সেটা দিয়েই decide করুন কোন দিকে যাবেন
Demo · approach · কোড — আগে নিজে চেষ্টা, আটকালে খুলুন

Demo: Search in Rotated Sorted ArrayLC 33 (Medium — Amazon/Meta/Google High)

Statement (Demo): unique elements বিশিষ্ট একটি sorted array nums কোনো একটি pivot index-এ rotate করা হয়েছে (যেমন: [0,1,2,4,5,6,7] হয়ে গেছে [4,5,6,7,0,1,2])। এই rotated array-তে একটি target মান খুঁজুন। যদি target থাকে তবে তার index return করুন, অন্যথায় -1 return করুন। runtime complexity অবশ্যই O(log n) হতে হবে। উদাহরণ: nums = [4,5,6,7,0,1,2], target = 0 → 4 | ⚡ n ≤ 5000, -10⁴ ≤ nums[i], target ≤ 10⁴

Approach: প্রতি ধাপে দেখুন কোন অর্ধেক sorted (nums[lo] <= nums[mid] হলে বাম)। target সেই sorted অর্ধেকের range-এ পড়লে সেদিকে যান, নাহলে অন্য দিকে।

function search(nums, target) {
  let lo = 0,
    hi = nums.length - 1;
  while (lo <= hi) {
    const mid = (lo + hi) >> 1;
    if (nums[mid] === target) return mid;
    if (nums[lo] <= nums[mid]) {
      // বাম অর্ধেক sorted
      if (nums[lo] <= target && target < nums[mid]) hi = mid - 1;
      else lo = mid + 1;
    } else {
      // ডান অর্ধেক sorted
      if (nums[mid] < target && target <= nums[hi]) lo = mid + 1;
      else hi = mid - 1;
    }
  }
  return -1;
}

Complexity: Time O(log n), Space O(1)

প্রবলেম

  • Find Minimum in Rotated Sorted Arrayplan · দিন ০১৫LC 153

    Statement: unique elements বিশিষ্ট sorted array nums (সাইজ n) ১ থেকে n বার rotate করা হয়েছে। এই rotated array থেকে ন্যূনতম (minimum) উপাদানটি খুঁজে বের করুন। O(log n) টাইম লিমিটে করতে হবে।
    উদাহরণ: nums = [3,4,5,1,2] → 1 | ⚡ n ≤ 5000, -5000 ≤ nums[i] ≤ 5000

    নোট · ফাঁকা
  • (ঢালের দিক দেখে অর্ধেক বাদ)

    Statement: একটি 0-indexed integer array nums দেওয়া আছে। একটি peak element খুঁজে তার index রিটার্ন করুন (peak element হলো যা তার আশেপাশের প্রতিবেশীদের চেয়ে কঠোরভাবে বড়, অর্থাৎ nums[i] > nums[i-1] এবং nums[i] > nums[i+1])। O(log n) টাইমে করতে হবে।
    উদাহরণ: nums = [1,2,3,1] → 2 | ⚡ n ≤ 1000, -2³¹ ≤ nums[i] ≤ 2³¹ - 1

    নোট · ফাঁকা