💡 Sorting the array first groups duplicates together, making it easy to detect duplicates by checking adjacent elements.
Intuition
Sort the array so duplicates become neighbors, then scan once to find any equal adjacent pair.
Algorithm
- Sort the input array.
- Iterate through the array from start to end - 1.
- Compare each element with the next one.
- If any pair is equal, return true.
- If no duplicates found, return false.
💡 Sorting changes the problem from comparing all pairs to just checking neighbors, simplifying the search.
def containsDuplicate(nums):
nums.sort()
for i in range(len(nums) - 1):
if nums[i] == nums[i + 1]:
return True
return False
# Driver code
if __name__ == '__main__':
print(containsDuplicate([1,2,3,1])) # True
print(containsDuplicate([1,2,3,4])) # False
Line Notes
nums.sort()Sort array to bring duplicates together
for i in range(len(nums) - 1)Iterate through array except last element
if nums[i] == nums[i + 1]Check adjacent elements for equality
return TrueReturn immediately if duplicate found
return FalseReturn false if no duplicates
import java.util.*;
public class Solution {
public static boolean containsDuplicate(int[] nums) {
Arrays.sort(nums);
for (int i = 0; i < nums.length - 1; i++) {
if (nums[i] == nums[i + 1]) {
return true;
}
}
return false;
}
public static void main(String[] args) {
System.out.println(containsDuplicate(new int[]{1,2,3,1})); // true
System.out.println(containsDuplicate(new int[]{1,2,3,4})); // false
}
}
Line Notes
Arrays.sort(nums);Sort array to group duplicates
for (int i = 0; i < nums.length - 1; i++)Loop through array except last element
if (nums[i] == nums[i + 1])Check adjacent elements for duplicates
return true;Return true immediately if duplicate found
return false;Return false if none found
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool containsDuplicate(vector<int>& nums) {
sort(nums.begin(), nums.end());
for (int i = 0; i < (int)nums.size() - 1; i++) {
if (nums[i] == nums[i + 1]) {
return true;
}
}
return false;
}
int main() {
vector<int> v1 = {1,2,3,1};
vector<int> v2 = {1,2,3,4};
cout << boolalpha << containsDuplicate(v1) << endl; // true
cout << boolalpha << containsDuplicate(v2) << endl; // false
return 0;
}
Line Notes
sort(nums.begin(), nums.end());Sort vector to bring duplicates together
for (int i = 0; i < (int)nums.size() - 1; i++)Loop through all but last element
if (nums[i] == nums[i + 1])Check adjacent elements for equality
return true;Return true immediately if duplicate found
return false;Return false if none found
function containsDuplicate(nums) {
nums.sort((a, b) => a - b);
for (let i = 0; i < nums.length - 1; i++) {
if (nums[i] === nums[i + 1]) {
return true;
}
}
return false;
}
// Test cases
console.log(containsDuplicate([1,2,3,1])); // true
console.log(containsDuplicate([1,2,3,4])); // false
Line Notes
nums.sort((a, b) => a - b);Sort array numerically to group duplicates
for (let i = 0; i < nums.length - 1; i++)Loop through array except last element
if (nums[i] === nums[i + 1])Check adjacent elements for duplicates
return true;Return true immediately if duplicate found
return false;Return false if none found
TimeO(n log n)
SpaceO(1) or O(n) depending on sorting implementation
Sorting takes O(n log n) time, then a single pass O(n) to check neighbors. Space depends on sort implementation.
💡 For n=100000, sorting is feasible and much faster than brute force, making this approach practical.
Interview Verdict: Accepted, but not optimal
This approach is efficient enough for many cases but can be improved using hash sets for linear time.