This blog will soon be merged with

JavaByPatel

which explains each solution in detail, to visit new blog, click JavaByPatel

Wednesday, 27 May 2015

Given an array and a number x, check for pair in array whose sum is x


package miscellaneous;

import java.util.ArrayList;
import java.util.List;

public class Find2NumbersWhoseSumIsKInArray {

 public static void main(String[] args) {
  int[] array = new int[]{10,-1,15,8,-1,15,1};
  /*List<Pair> listOfPair = getPairUsingHashtable(array, 14);
  for (Pair pair : listOfPair) {
   System.out.print(pair.getA() + " " + pair.getB() + "\n");
  }*/
  
  List<Pair> listOfPair = getPairUsing2Pointers(array, 14);
  for (Pair pair : listOfPair) {
   System.out.print(pair.getA() + " " + pair.getB() + "\n");
  }
 }
 
 //Time Complexity O(n), Space Complexity O(n) 
 private static List<Pair> getPairUsingHashtable(int arr[], int k){
  if(arr==null || arr.length<1)return null;
  
  List<Pair> listOfPair = new ArrayList<Pair>();
  List<Integer> list = new ArrayList<Integer>();
  for (int i = 0; i < arr.length; i++) {
   int temp = k - arr[i];
   if(list.contains(temp)){
    listOfPair.add(new Pair(arr[i], temp));
    list.remove(list.indexOf(temp));
   }else{
    list.add(arr[i]);
   }
  }
  return listOfPair;
 }

 //Time Complexity O(n log n), Space Complexity O(1)
 //Sorting O(n log n)
 //Finding Pair O(n)
 //Total complexity: O(n) + O(n log n) = O(n log n)
 //How O(n) + O(n log n) = O(n log n) ? 
 //For Big O complexity, all you care about is the dominant term.  n log(n) dominates n so that's the only term that you care about.
 //Another Way, the complexity class for function is the union of O(n) and O(n log(n)) but O(n log(n)) is a superset of O(n) so really it is just O(n log(n)).
 private static List<Pair> getPairUsing2Pointers(int arr[], int k){
  if(arr==null || arr.length<1)return null;
  
  //First Sort the array
  System.out.println("Before Sorting :");
  printArray(arr);
  quickSort(arr, 0, arr.length-1);
  System.out.println("After Sorting :");
  printArray(arr);
  
  List<Pair> listOfPair = new ArrayList<Pair>();
  int i=0;
  int j=arr.length-1;
  while(i<=j){
   if(arr[i]+arr[j]==k){
    listOfPair.add(new Pair(arr[i], arr[j]));
    i++;
    j--;
   }else if(arr[i]+arr[j]>k){
    j--;
   }else{
    i++;
   }
  }
  return listOfPair;
 }
 
 private static void quickSort(int[] array, int lowerIndex, int higherIndex) {
  int i = lowerIndex;
  int j = higherIndex;
  int pivot = array[lowerIndex+(higherIndex-lowerIndex)/2];
  while (i <= j) {
   while (array[i] < pivot) {
    i++;
   }
   while (array[j] > pivot) {
    j--;
   }
   if (i <= j) {
    int tmp = array[i];
    array[i]=array[j];
    array[j]=tmp;
    i++;
    j--;
   }
  }
  if (lowerIndex < j)
   quickSort(array, lowerIndex, j);
  if (i < higherIndex)
   quickSort(array, i, higherIndex);
 }

 private static void printArray(int arr[]){
  for (int i = 0; i < arr.length; i++) {
   System.out.print(arr[i] + " ");
  }
  System.out.println();
 }
}

class Pair{
 private int a;
 private int b;
 public Pair(int a, int b) {
  this.a = a;
  this.b = b;
 }
 public int getA() {
  return a;
 }
 public void setA(int a) {
  this.a = a;
 }
 public int getB() {
  return b;
 }
 public void setB(int b) {
  this.b = b;
 }
}



No comments:

Post a Comment