https://leetcode.com/problems/find-all-duplicates-in-an-array/
Example 1:
Input: nums = [4,3,2,7,8,2,3,1] Output: [2,3]
package pep.Day62;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
public class LeetCode_442_Find_All_Duplicates_in_Array {
public static void main(String[] args) {
int[] arr = new int[]{4, 3, 2, 7, 8, 2, 3, 1};
System.out.print(findDuplicates1(arr));
}
public static List<Integer> findDuplicates(int[] nums) {
int i = 0, n = nums.length;
List<Integer> ans = new LinkedList<>();
while (i < n) {
if (nums[nums[i] - 1] == nums[i]) {
i++;
} else {
int temp = nums[nums[i] - 1];
nums[nums[i] - 1] = nums[i];
nums[i] = temp;
}
}
i = 0;
while (i < n) {
if (nums[i] - 1 != i)
ans.add(nums[i]);
i++;
}
return ans;
}
// using on one for loop
// logic: jo bhi number first time mil gya usko -ve kr do,
// and jab woh second time milega to ans me add
public static Set<Integer> findDuplicates1(int[] nums) {
int i = 0, n = nums.length;
Set<Integer> ans = new HashSet<>();
while (i < n) {
// agr number pehle se hi -ve hai, means visit ho chuka hai yeh
if (nums[i] <0)
i++;
// -ve of mera number and usko sahi position pr jo number hai dono same hai
// hence, add in ans
else if (nums[nums[i] - 1] == -1 * nums[i]) {
ans.add(nums[i]);
i++;
} else {
int temp = nums[nums[i] - 1];
nums[nums[i] - 1] = -1 * nums[i];
nums[i] = temp;
}
}
// i = 0;
// while (i < n) {
// if (nums[i] - 1 != i)
// ans.add(nums[i]);
// i++;
// }
return ans;
}
}












