I have this Java solution to LeetCode's 3Sum problem.
I would be really grateful if I could get feedback on correctness, scalability, efficiency, coding best practices, and OOP design.
I'm relatively new to Java.
class Solution
{
public List<List<Integer>> threeSum(int[] nums)
{
List l1 = new ArrayList<ArrayList>();
for (int idx = 0; idx < nums.length; idx++)
{
if (idx > 0 && nums[idx] == nums[idx - 1]) continue;
HashMap<Integer, Integer> hash = new HashMap<>();
for (int idxInner = idx + 1; idxInner < nums.length; idxInner++)
{
if (
hash.get(nums[idxInner]) != null &&
nums[idxInner]+hash.get(nums[idxInner]) == -1*nums[idx]
)
{
List l2 = new ArrayList<Integer>();
addInList(l2, nums[idx]);
addInList(l2, hash.get(nums[idxInner]));
addInList(l2, nums[idxInner]);
l1.add(l2);
}
else
{
hash.put(-1*(nums[idx] + nums[idxInner]), nums[idxInner]);
}
}
}
removeDuplicates(l1);
return l1;
}
public void addInList(List<Integer> list, int num)
{
if (list == null) return;
int lSize = list.size();
if (lSize == 0)
{
list.add(num);
return;
}
int idx = 0;
while (idx < lSize && list.get(idx) < num)
{
idx++;
}
if (idx < lSize) list.add(idx, num);
else list.add(num);
return;
}
public void removeDuplicates(List<ArrayList<Integer>> lists)
{
if(lists == null) return;
for(int outer = 0; outer < lists.size(); outer++)
{
for(int inner = outer + 1; inner < lists.size(); inner++)
{
if (areDuplicates(lists.get(outer), lists.get(inner)))
{
lists.remove(inner);
inner--;
}
}
}
}
public boolean areDuplicates(ArrayList<Integer> first, ArrayList<Integer> second)
{
if (first == null && first == second) return true;
if (first == null || second == null) return false;
int fSize = first.size();
int sSize = second.size();
if (fSize != sSize) return false;
for(int idx = 0; idx < fSize; idx++)
{
if (first.get(idx) != second.get(idx)) return false;
}
return true;
}
}
I get a timeout error on LeetCode if I try to run this.