๐ Coding Interview Questions with Answers โ Part 6
๐ Sorting, Searching & Dynamic Programming
๐ 51. How do you implement quicksort and mergesort?
Both are divide-and-conquer sorting algorithms.
๐น Quicksort
๐น Idea
1. Pick pivot
2. Partition array
3. Recursively sort halves
๐น Python Quicksort
def quicksort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr)//2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quicksort(left) + middle + quicksort(right)
print(quicksort([5,2,8,1,3]))
๐น Complexity
Case: Best/Average โ Complexity: O(n log n)
Case: Worst โ Complexity: O(nยฒ)
๐น Mergesort
๐น Idea
1. Split array
2. Sort recursively
3. Merge sorted halves
๐น Python Mergesort
def mergesort(arr):
if len(arr) <= 1:
return arr
mid = len(arr)//2
left = mergesort(arr[:mid])
right = mergesort(arr[mid:])
return merge(left, right)
def merge(left, right):
result = []
i = j = 0
while i < len(left) and j < len(right):
if left[i] < right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
result.extend(left[i:])
result.extend(right[j:])
return result
๐น Complexity
Case: All Cases โ Complexity: O(n log n)
๐น Interview Tip
Mergesort is stable. Quicksort is usually faster in practice.
๐ 52. How do you implement binary search in a rotated sorted array?
Example:
Target: 0[4][5][6][7][0][1][2]
๐น Key Idea
One half is always sorted.
๐น Python Solution
def search(nums, target):
left, right = 0, len(nums)-1
while left <= right:
mid = (left + right)//2
if nums[mid] == target:
return mid
if nums[left] <= nums[mid]:
if nums[left] <= target < nums[mid]:
right = mid - 1
else:
left = mid + 1
else:
if nums[mid] < target <= nums[right]:
left = mid + 1
else:
right = mid - 1
return -1
๐น Complexity
Time: O(log n)
Space: O(1)
๐น Interview Tip
Very common medium-level interview problem.
๐ 53. How do you implement insertion sort and when is it useful?
Insertion sort inserts elements into correct position.
๐น Python Solution
def insertion_sort(arr):
for i in range(1, len(arr)):
key = arr[i]
j = i - 1
while j >= 0 and arr[j] > key:
arr[j+1] = arr[j]
j -= 1
arr[j+1] = key
return arr
๐น Complexity
Case: Best โ Complexity: O(n)
Case: Average/Worst โ Complexity: O(nยฒ)
๐น When Useful?
โ
Small datasets
โ
Nearly sorted arrays
โ
Online sorting
๐น Interview Tip
Simple but important for fundamentals.
๐ 54. How do you find the k-th largest element?
๐น Efficient Approach
Use: Min Heap OR Quickselect
๐น Heap Solution
import heapq
def kth_largest(nums, k):
return heapq.nlargest(k, nums)[-1]
print(kth_largest([3,2,1,5,6,4], 2))
๐น Output
5
๐น Complexity
Time: O(n log k)
Space: O(k)
๐น Interview Tip
Quickselect is often asked as optimization.
๐ 55. What is the difference between DFS and backtracking?
Both use recursion, but purpose differs.
๐น DFS
Goal: Traverse/search graph or tree
๐น Backtracking
Goal: Try all possibilities and undo choices
๐น Example Problems
DFS: Tree traversal, Graph traversal
Backtracking: N-Queens, Sudoku, Permutations
๐น Key Difference
DFS: Traversal, No undo step
Backtracking: Decision making, Includes undo step
๐น Interview Tip
Backtracking = DFS + constraint checking + undoing choices.
๐ 56. How do you solve the โN-Queensโ problem?
Place N queens so none attack each other.
๐น Backtracking Solution
def solve_n_queens(n):
board = [-1] * n
result = []
Post #2973
1.52K
- โค 1