kunal-kushwaha / DSA-Bootcamp-Java

This repository consists of the code samples, assignments, and notes for the Java data structures & algorithms + interview preparation bootcamp of WeMakeDevs.
https://www.youtube.com/playlist?list=PL9gnSGHSqcnr_DxHsP7AW9ftq0AtAyYqJ
17.6k stars 11.25k forks source link

lectures/10-binary search/code/src/com/kunal/InfiniteArray.java .ArrayIndexOutOfBoundsException #1298

Open Yash531548 opened 6 months ago

Yash531548 commented 6 months ago

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 13 out of bounds for length 11

// condition for the target to lie in the range while (target > arr[end]) { int temp = end + 1; // this is my new start // double the box value // end = previous end + sizeofbox2 end = end + (end - start + 1) 2; start = temp; } return binarySearch(arr, target, start, end);

In this end value have exceed the length of array which is the cause of an error of outofboundexception for example int[] arr = {3, 5, 7, 9, 10, 90, 100, 130, 140, 160, 170}; everything after 90 is going to show this error

Ketan-Chaudhary commented 5 months ago

package Questions;

public class InfiniteArray {

public static void main(String[] args) {
    int[] arr = {3, 5, 7, 9, 10, 90, 100, 130, 140, 160, 170};
    int target = 170;
    System.out.println(ans(arr, target));
}

static int ans(int[] arr, int target) {
    // first find the range
    // first start with a box of size 2
    int start = 0;
    int end = 1;

    // condition for the target to lie in the range
    while (end < arr.length && target > arr[end]) {
        int temp = end + 1; // this is my new start
        // double the box value
        // end = previous end + sizeofbox*2
        end = end + (end - start + 1) * 2;
        start = temp;
    }

    // Adjust the end to the last index if it exceeds the length
    if (end >= arr.length) {
        end = arr.length - 1;
    }

    return binarySearch(arr, target, start, end);
}

static int binarySearch(int[] arr, int target, int start, int end) {
    while (start <= end) {
        // find the middle element
        // int mid = (start + end) / 2; // might be possible that (start + end) exceeds the range of int in java
        int mid = start + (end - start) / 2;

        if (target < arr[mid]) {
            end = mid - 1;
        } else if (target > arr[mid]) {
            start = mid + 1;
        } else {
            // ans found
            return mid;
        }
    }
    return -1;
}

}

  1. Added end < arr.length to ensure end does not go out of bounds.
  2. Added a check to set end to arr.length - 1 if it exceeds the array length.