View on GitHub

SCRATCH PAD

No polish, just pulse


1. The N-th Root of an Integer

  public int NthRoot(int n, int x) {
      int low = 1, high = x;
      while (low <= high) {
          int mid = low + (high - low) / 2;
          long midPow = (long) Math.pow(mid, n);
          if (midPow == x) {
              return mid;
          } else if (midPow < x) {
              low = mid + 1;
          } else {
              high = mid - 1;
          }
      }
      return -1;  // No integer nth root found
  }
  

2. Matrix Median

  public int findMedian(int[][] matrix) {
      int rows = matrix.length, cols = matrix[0].length;
      int low = matrix[0][0], high = matrix[0][cols - 1];
      
      for (int i = 1; i < rows; i++) {
          low = Math.min(low, matrix[i][0]);
          high = Math.max(high, matrix[i][cols - 1]);
      }

      int desired = (rows * cols + 1) / 2;

      while (low < high) {
          int mid = low + (high - low) / 2;
          int count = 0;

          for (int i = 0; i < rows; i++) {
              count += countLessEqual(matrix[i], mid);
          }

          if (count < desired) {
              low = mid + 1;
          } else {
              high = mid;
          }
      }
      
      return low;
  }

  private int countLessEqual(int[] row, int mid) {
      int low = 0, high = row.length;
      while (low < high) {
          int midIndex = low + (high - low) / 2;
          if (row[midIndex] <= mid) {
              low = midIndex + 1;
          } else {
              high = midIndex;
          }
      }
      return low;
  }
  
    [[1, 3, 5],
     [2, 6, 9],
     [3, 6, 9]]
    

3. Find the Element that Appears Once in a Sorted Array, and the Rest Element Appears Twice (Binary Search)

  public int findSingleElement(int[] nums) {
      int low = 0, high = nums.length - 1;
      while (low < high) {
          int mid = low + (high - low) / 2;
          if (mid % 2 == 1) mid--;  // Make sure mid is always even
          
          if (nums[mid] == nums[mid + 1]) {
              low = mid + 2;  // Move to the right part
          } else {
              high = mid;  // Move to the left part
          }
      }
      return nums[low];
  }
  

4. Search Element in a Sorted and Rotated Array / Find Pivot Where It is Rotated

  public int search(int[] nums, int target) {
      int low = 0, high = nums.length - 1;

      while (low <= high) {
          int mid = low + (high - low) / 2;

          if (nums[mid] == target) return mid;

          if (nums[low] <= nums[mid]) {  // Left half is sorted
              if (nums[low] <= target && target < nums[mid]) {
                  high = mid - 1;
              } else {
                  low = mid + 1;
              }
          } else {  // Right half is sorted
              if (nums[mid] < target && target <= nums[high]) {
                  low = mid + 1;
              } else {
                  high = mid - 1;
              }
          }
      }

      return -1;
  }
  

5. Median of 2 Sorted Arrays

  public double findMedianSortedArrays(int[] nums1, int[] nums2) {
      if (nums1.length > nums2.length) {
          return findMedianSortedArrays(nums2, nums1);
      }
      
      int x = nums1.length, y = nums2.length;
      int low = 0, high = x;
      
      while (low <= high) {
          int partitionX = (low + high) / 2;
          int partitionY = (x + y + 1) / 2 - partitionX;
          
          int maxX = (partitionX == 0) ? Integer.MIN_VALUE : nums1[partitionX - 1];
          int minX = (partitionX == x) ? Integer.MAX_VALUE : nums1[partitionX];
          
          int maxY = (partitionY == 0) ? Integer.MIN_VALUE : nums2[partitionY - 1];
          int minY = (partitionY == y) ? Integer.MAX_VALUE : nums2[partitionY];
          
          if (maxX <= minY && maxY <= minX) {
              if ((x + y) % 2 == 0) {
                  return (Math.max(maxX, maxY) + Math.min(minX, minY)) / 2.0;
              } else {
                  return Math.max(maxX, maxY);
              }
          } else if (maxX > minY) {
              high = partitionX - 1;
          } else {
              low = partitionX + 1;
          }
      }
      return -1;
  }
  

6. K-th Element of Two Sorted Arrays

  public int findKthElement(int[] nums1, int[] nums2, int k) {
      if (nums1.length > nums2.length) {
          return findKthElement(nums2, nums1, k);
      }
      
      int low = 0, high = nums1.length;
      
      while (low <= high) {
          int partitionX = (low + high) / 2;
          int partitionY = k - partitionX;
          
          int

 maxX = (partitionX == 0) ? Integer.MIN_VALUE : nums1[partitionX - 1];
          int minX = (partitionX == nums1.length) ? Integer.MAX_VALUE : nums1[partitionX];
          
          int maxY = (partitionY == 0) ? Integer.MIN_VALUE : nums2[partitionY - 1];
          int minY = (partitionY == nums2.length) ? Integer.MAX_VALUE : nums2[partitionY];
          
          if (maxX <= minY && maxY <= minX) {
              return Math.max(maxX, maxY);
          } else if (maxX > minY) {
              high = partitionX - 1;
          } else {
              low = partitionX + 1;
          }
      }
      
      return -1;
  }
  

7. Allocate Minimum Number of Pages

  public boolean isValid(int[] arr, int n, int m, int mid) {
      int studentCount = 1, pages = 0;
      for (int i = 0; i < n; i++) {
          if (pages + arr[i] > mid) {
              studentCount++;
              pages = arr[i];
              if (studentCount > m) {
                  return false;
              }
          } else {
              pages += arr[i];
          }
      }
      return true;
  }

  public int allocatePages(int[] arr, int n, int m) {
      int low = arr[0], high = 0;
      for (int i = 0; i < n; i++) {
          high += arr[i];
      }
      
      int result = -1;
      
      while (low <= high) {
          int mid = low + (high - low) / 2;
          
          if (isValid(arr, n, m, mid)) {
              result = mid;
              high = mid - 1;
          } else {
              low = mid + 1;
          }
      }
      
      return result;
  }
  

8. Aggressive Cows

  public boolean isPossible(int[] arr, int n, int k, int mid) {
      int count = 1, lastPosition = arr[0];
      for (int i = 1; i < n; i++) {
          if (arr[i] - lastPosition >= mid) {
              count++;
              lastPosition = arr[i];
              if (count == k) return true;
          }
      }
      return false;
  }

  public int aggressiveCows(int[] arr, int n, int k) {
      Arrays.sort(arr);
      int low = 1, high = arr[n - 1] - arr[0], result = -1;
      
      while (low <= high) {
          int mid = low + (high - low) / 2;
          
          if (isPossible(arr, n, k, mid)) {
              result = mid;
              low = mid + 1;
          } else {
              high = mid - 1;
          }
      }
      
      return result;
  }