简体   繁体   中英

Finding the missing number in an array with nested for loops in Java

I need to find the missing number in an array in O(n^2) time. I can rearrenge the array, so it is in order, but I have a difficult time finding the missing number without running another for loop, but I can't do that. Here is my code: The missing number is 3 here.

public static void main(String[] args){
    int ar []={0,1,6,2,5,7,4};
    int n = ar.length;
    int temp = 0;
    int m = 0;
    for(int i = 0; i<n;i++){
        for(int j = 1; j<n;j++){
            if(ar[j-1] > ar[j]){
                temp = ar[j-1];
                ar[j-1]=ar[j];
                ar[j]=temp;

                if(ar[j-1]!=j-1) m=j;
            }
            else ar[j]=ar[j];
            if(ar[j-1]!=j-1) m=j;
        }
    }
    System.out.println(m);
}

If the input array contains all the numbers between 0 and ar.length except one missing number (as in your {0,1,6,2,5,7,4} example), you can find the missing number in linear time.

Just calculate the sum of all the numbers of the full array (the one including the missing number) - that array has ar.length + 1 elements from 0 to ar.length , so its sum is (ar.length - 0)*(ar.length + 1)/2 - and subtract from it the actual sum (which you can compute in a simple linear time loop). The difference would be the missing number.

If there are multiple missing numbers (or there may be duplicate numbers), and you need to find the first missing number, sorting the array in O(n*log(n) time and then making a single (linear time) pass over the sorted array would still be better than an O(n^2) solution.

If you can only do 2 loops, and must do 2 loops for O(n^2), then I suggest the following:

  • Loop thru all values (outer loop).
  • For each value, loop thru all values (inner loop) and find smallest value higher than current value.
  • If no higher value found, skip (current value is highest value)
  • If smallest value found is not current value + 1, then you found the missing value

How about this?

int array[] = {0,1,6,2,5,7,4};
int arrayTemp[] = array;
ArrayList<Integer> missing = new ArrayList();
Arrays.sort(arrayTemp);

for (int i=1; i<arrayTemp.length; i++) {
    for (int j=arrayTemp[i-1]+1; j<arrayTemp[i]; j++) {
        missing.add(j);
    }
}
for (int i=arrayTemp[arrayTemp.length-1]+1; i<=arrayTemp[arrayTemp.length-1]; i++) {
    missing.add(i);
}

System.out.println(missing.toString());

Output:

{0,1,6,2,5,7,4}    -> [3]
{0,1,6,2,5,7,4,14} -> [3, 8, 9, 10, 11, 12, 13]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM