saurabh73
2/28/2020 - 5:52 PM

Leet Code Week1

package platform.leetcode.problem0007;

import base.ISolution;
import common.Entry;
import common.io.input.InputReader;
import common.io.utils.Utility;

import java.io.InputStream;
import java.util.Arrays;

/**
 * @author Saurabh Dutta
 * @see <a href="https://leetcode.com/problems/search-in-rotated-sorted-array/">https://leetcode.com/problems/search-in-rotated-sorted-array/</a>
 **/
public class SearchInRotatedSortedArray implements ISolution {

    @Override
    public void solve(InputStream in) throws Exception {
        InputReader reader = new InputReader(in);
        String line = reader.readLine();
        int[] input = Utility.getIntArray(line);
        int target = Integer.parseInt(reader.readLine());
        System.out.println(search(input, target));
    }


    @Entry
    public int search(int[] nums, int target) {
        if (nums.length > 0) {
            // find pivot
            Integer[] arr = Arrays.stream( nums ).boxed().toArray( Integer[]::new );
            int pivot = findPivot(nums, 0, nums.length - 1);
            int first  = nums[0];
            int last = nums[nums.length -1];
            int max = nums[pivot];
            // normal sorted array
            if (last == max) {
                return Math.max(-1, Arrays.binarySearch(arr, target));
            }
            // sorted array with first element out of place
            else if (first == max) {
                if (target == max) {
                    return 0;
                }
                return Math.max(-1,Arrays.binarySearch(arr, 1, nums.length, target));
            }
            // target in first half
            else if (target >= first && target <= max) {
                return Math.max(-1,Arrays.binarySearch(arr,0 , pivot + 1, target));
            }
            // target in last half
            else {
                return Math.max(-1,Arrays.binarySearch(arr,pivot+1 , nums.length, target));
            }
        } else {
            return -1;
        }
    }


    private int findPivot(int[] nums, int start, int end) {
        int mid = (start + end) / 2;
        // sorted, take last value
        if (nums[mid] >= nums[end] && nums[mid] <= nums[start]) {
            return start;
        }
        // sorted reverse, take first value
        if (nums[mid] <= nums[end] && nums[mid] >= nums[start]) {
            return end;
        }
        //left half is sorted, go to right
        if (nums[mid] >= nums[end] && nums[mid] >= nums[start]) {
            if(nums[mid] >= nums[mid+1]) {
                return mid;
            }
            return findPivot(nums, mid +1, end);
        }
        //right half is sorted, go to left
        if (nums[mid] <= nums[start] && nums[mid] <= nums[end]) {
            return findPivot(nums, start, mid -1 );
        }
        return -1; // pivot not found
    }
}
package platform.leetcode.problem0008;
import base.ISolution;
import common.Entry;
import common.io.input.InputReader;
import common.io.utils.Utility;

import java.io.InputStream;

/**
*
* @author Saurabh Dutta
* @see <a href="https://leetcode.com/problems/merge-sorted-array/">https://leetcode.com/problems/merge-sorted-array/</a> 
*
**/
public class MergeSortedArray implements ISolution {

    @Override
    public void solve(InputStream in) throws Exception{
        InputReader reader = new InputReader(in);
        int[] nums1 = Utility.getIntArray(reader.readLine());
        int m = Integer.parseInt(reader.readLine());
        int[] nums2 = Utility.getIntArray(reader.readLine());
        int n = Integer.parseInt(reader.readLine());
        merge(nums1,m,nums2,n);
        for(int num: nums1) {
            System.out.print(num + " ");
        }
    }

    @Entry
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int pointer1 = m-1;
        int pointer2 = n-1;

        for(int i = nums1.length-1; i>=0; i--) {
            if (pointer1>=0 && pointer2>=0) {
                if (nums1[pointer1] >= nums2[pointer2]) {
                    nums1[i] = nums1[pointer1];
                    pointer1--;
                } else {
                    nums1[i] = nums2[pointer2];
                    pointer2--;
                }
            } else {
                if (pointer1 >=0) {
                    nums1[i] = nums1[pointer1];
                    pointer1--;
                }
                else {
                    nums1[i] = nums2[pointer2];
                    pointer2--;
                }
            }
        }
    }
}