How to Compare two arrays and Check both values are matched or not in Java
Problem Description :
A school is trying to take an annual photo of all the students. The students are asked to stand in a single file line in non-decreasing order by height. Let this ordering be represented by the integer array expected where expected[i] is the expected height of the ith student in line.
You are given an integer array heights representing the current order that the students are standing in. Each heights[i] is the height of the ith student in line (0-indexed).
Return the number of indices where heights[i] != expected[i].
Example 1 :
Input: heights = [1,1,4,2,1,3]
Output: 3
Explanation: 
heights:  [1,1,4,2,1,3]
expected: [1,1,1,2,3,4]
Indices 2, 4, and 5 do not match.Example 2 :
Input: heights = [5,1,2,3,4]
Output: 5
Explanation:
heights:  [5,1,2,3,4]
expected: [1,2,3,4,5]
All indices do not match.Example 3 :
Input: heights = [1,2,3,4,5]
Output: 0
Explanation:
heights:  [1,2,3,4,5]
expected: [1,2,3,4,5]
All indices match.In above problem, we have to simply sort the array and check it is matching values or not. So lets jump on solution and explanation.
Solution 1 :
class Solution {
public int heightChecker(int[] heights) {
int[] copiedHeights = new int[heights.length];
for (int i = 0; i < heights.length; i++) {
copiedHeights[i] = heights[i];
}
Arrays.sort(copiedHeights);
int notMatched = 0;
for (int i = 0; i < heights.length; i++) {
if (heights[i] != copiedHeights[i]) {
notMatched = notMatched+1;
}
}
return notMatched;
}
}
Solution explanation :
- First we declare another array copiedHeights same length as heights array.
- Using for loop, assign all heights array values to copiedHeights array.
- Sort the copiedHeights array using Arrays.sort() method.
- Traverse through heights array, check heights array values matched the sorted array not. If not matched then increase the notMatched variable by one.
- Return notMatched variable.
Output explanation :
heights : [1, 1 ,4, 2, 1, 3]
After copied and sorting copiedHeights array.
copiedHeights : [1, 1, 1, 2, 3, 4]
- i = 0, notMatched = 0
- heights[0] != copiedHeights[0] | 1 !=1 becomes false
- i = 1, notMatched = 0
- 1 != 1 becomes false
- i = 2, notMatched = 0
- 4 != 1 becomes true
- notMatched = 1
- i = 3, notMatched = 1
- 2 != 2 becomes false
- i = 4, notMatched = 1 
- 1 != 3 becomes true
- notMatched = 2
- i = 5, notMatched = 2 
- 3 != 4 becomes true
- notMatched = 3
- Return 3
We can also copy array without for loop. using clone() method.
Solution 2 :
class Solution {
    public int heightChecker(int[] heights) {
// Copy heights array into copiedHeights
int[] copiedHeights = heights.clone();
// Sort copiedHeights
Arrays.sort(copiedHeights);
int notMatched = 0;
for (int i = 0; i < heights.length; i++) {
if (heights[i] != copiedHeights[i]) {
notMatched = notMatched+1;
}
}
return notMatched;
}
}
We can also copy and sort array in one line. lets see in following code. 
Solution 3 :
class Solution {
    public int heightChecker(int[] heights) {
       
        // Copy and sort heights array
        int[] copiedHeights = Arrays.stream(heights).sorted().toArray();
        
        int notMatched = 0;
        for (int i = 0; i < heights.length; i++) {
            if (heights[i] != copiedHeights[i]) {
                notMatched = notMatched+1;
            }
        }
        
        return notMatched;
    }
}Other LeetCode problem's solution in Java :

Comments
Post a Comment