10. Two Pointer Technique
Two Pointer Technique অ্যারের সমস্যা সমাধানে অত্যন্ত কার্যকর। এতে দুটি পয়েন্টার ব্যবহার করে টাইম কমপ্লেক্সিটি অনেক কমিয়ে আনা যায়।
1. পেয়ার সাম (Pair Sum / Two Sum in Sorted Array)
একটি সর্টেড অ্যারে থেকে দুটি সংখ্যা খুঁজে বের করা যাদের যোগফল টার্গেটের সমান।
🛠 কর্মপদ্ধতি (Step-by-Step Logic)
- দুটি পয়েন্টার নিন:
left(শুরুতে) ওright(শেষে)। - ইনডেক্স দুটির ভ্যালু যোগ করুন (
sum = arr[left] + arr[right])। - যদি
sum == targetহয়, তবে সমাধান পাওয়া গেল। - যদি
sum < targetহয়, তবে যোগফল বাড়ানোর জন্যleftপয়েন্টার ডানে সরান। - যদি
sum > targetহয়, তবে যোগফল কমানোর জন্যrightপয়েন্টার বামে সরান।
📊 কমপ্লেক্সিটি অ্যানালাইসিস (Complexity Analysis)
- Time Complexity: O(n) - লুপের সাহায্যে এক পাশ থেকে অন্য পাশে একবার আসা।
- Space Complexity: O(1)
java
// Java
public int[] twoSum(int[] arr, int target) {
int left = 0, right = arr.length - 1;
while (left < right) {
int sum = arr[left] + arr[right];
if (sum == target) return new int[]{left, right};
if (sum < target) left++;
else right--;
}
return new int[]{-1, -1};
}python
# Python
def two_sum(arr, target):
left, right = 0, len(arr) - 1
while left < right:
current_sum = arr[left] + arr[right]
if current_sum == target:
return [left, right]
elif current_sum < target:
left += 1
else:
right -= 1
return [-1, -1]2. কন্টেইনার উইথ মোস্ট ওয়াটার (Container with Most Water)
দুটি লাইন বেছে নিতে হবে যাতে তাদের মাঝখানে সবচেয়ে বেশি পানি ধরে রাখা যায়।
🛠 কর্মপদ্ধতি (Step-by-Step Logic)
- দুটি পয়েন্টার নিন: একদম শুরুতে এবং একদম শেষে।
- এরিয়া ক্যালকুলেট করুন:
Area = (Difference of Indices) * (Minimum Height). maxAreaট্র্যাক করুন।- পয়েন্টার সরানোর শর্ত: যে পয়েন্টারের হাইট ছোট, সেটিকে সরাতে হবে (ভবিষ্যতে বড় হাইট পাওয়ার আশায়)।
📊 কমপ্লেক্সিটি অ্যানালাইসিস (Complexity Analysis)
- Time Complexity: O(n)
- Space Complexity: O(1)
Implementation
java
// Java
public int maxArea(int[] height) {
int left = 0, right = height.length - 1, maxArea = 0;
while (left < right) {
int h = Math.min(height[left], height[right]);
maxArea = Math.max(maxArea, h * (right - left));
if (height[left] < height[right]) left++;
else right--;
}
return maxArea;
}python
# Python
def max_area(height):
left, right = 0, len(height) - 1
max_area = 0
while left < right:
h = min(height[left], height[right])
max_area = max(max_area, h * (right - left))
if height[left] < height[right]:
left += 1
else:
right -= 1
return max_area3. সর্ট কালারস (Sort Colors / Dutch National Flag)
০, ১ এবং ২ সমৃদ্ধ একটি অ্যারেকে সর্ট করা ($O(n)$ এ)।
🛠 কর্মপদ্ধতি (Step-by-Step Logic)
- তিনটি পয়েন্টার নিন:
low(০ এর জন্য),mid(১ এর জন্য) এবংhigh(২ এর জন্য)। - যদি
arr[mid] == 0হয়, তবেlowএবংmidসোয়াপ করুন এবং দুটিই এক ঘর বাড়ান। - যদি
arr[mid] == 1হয়, তবে শুধুmidএক ঘর বাড়ান। - যদি
arr[mid] == 2হয়, তবেmidএবংhighসোয়াপ করুন এবংhighএক ঘর কমান।
📊 কমপ্লেক্সিটি অ্যানালাইসিস (Complexity Analysis)
- Time Complexity: O(n) - মাত্র একবার অ্যারে ট্রাভার্স করতে হয়।
- Space Complexity: O(1)
Implementation
java
// Java
public void sortColors(int[] nums) {
int low = 0, mid = 0, high = nums.length - 1;
while (mid <= high) {
if (nums[mid] == 0) {
int temp = nums[low];
nums[low++] = nums[mid];
nums[mid++] = temp;
} else if (nums[mid] == 1) mid++;
else {
int temp = nums[high];
nums[high--] = nums[mid];
nums[mid] = temp;
}
}
}python
# Python
def sort_colors(nums):
low, mid, high = 0, 0, len(nums) - 1
while mid <= high:
if nums[mid] == 0:
nums[low], nums[mid] = nums[mid], nums[low]
low += 1
mid += 1
elif nums[mid] == 1:
mid += 1
else:
nums[high], nums[mid] = nums[mid], nums[high]
high -= 1IMPORTANT
টু-পয়েন্টার অ্যাপ্লাই করার আগে চেক করুন ডাটা সর্টেড কি না। সর্টেড না হলে এটি কাজ নাও করতে পারে।