//
// main.cpp
// subarray
//
// Created by Ricky Tsao on 6/22/16.
// Copyright © 2016 Epam. All rights reserved.
//
#include <iostream>
using namespace std;
//utility
void initArray(int ** array, int length) {
for ( int z = 0; z < length; z++) {
*(*array+z) = -1;
}
}
void printArray(int array []) {
int * temp = array;
while (*temp != -1) {
cout << *temp << endl;
temp++;
}
}
int getArrayLen(int array []) {
int * temp = array;
int length = 0;
while (*(temp++) != -1) {
length++;
}
return length;
}
//make sure we get an array called unique
//1)
// given an original array
// we need a unique array
//O(n)
bool doesIntExistInUnique(int val, int unique [], int length ) {
for (int i = 0 ; i < length; i++ ) {
if(unique[i]==val)
return true; //val exists in unique
}
return false; //val does not exist in unique
}
// O(n^2)
int * generateUniqueArray( int originalArray [], int length) {
int uniqueCur = 0; //remind
int * heapArray = new int[length]; //create an array in the heap
//init to -1
initArray(&heapArray, length);
//O(n)
for (int i = 0; i < length; i++) {
int origNum = originalArray[i];
if(origNum == -1) break;
if(!doesIntExistInUnique(originalArray[i], heapArray, length)) {
//we add it to our heap array
heapArray[uniqueCur++] = originalArray[i];
}
}
return heapArray;
}
//O(n)
int earliestIndex(int original [], int unique [] ) {
//
int cur = 0;
int uniqueArrayLength = getArrayLen(unique);
for (int j = 0; j < getArrayLen(original); j++) {
int toCompare = original[j];
if(toCompare == unique[cur]){
cur++;
if(cur==uniqueArrayLength)
return j;
}
}
return -1;
}
int main(int argc, const char * argv[]) {
//create test array
//passed tests
//3,3,2,0,2, -1
//3,3,2,0,2,0,2, -1
//3,3,3,3,3,3,3, -1
//1,3,5,1,3,5,1,3,5,-1
//1,1,1,1,1,1,1,-1
int arr[10] = {1,1,1,1,1,1,1,-1}; //-1 terminating
//1) create a unique array
int * uniqueArray = generateUniqueArray(arr, 10);
printArray(uniqueArray); //check
//2) given the original array "arr", and unique array "unique",
//we can then figure out where the earliest index happen
int answer = earliestIndex(arr, uniqueArray);
return 0;
}