LeetCode 350. 兩個陣列的交集 II
阿新 • • 發佈:2020-07-13
題目連結
題目分析
這個題目要求我們求兩個陣列的交集,那麼我們最簡單的思想就是利用map去做一個快取,然後針對另外一個數組,去檢查快取中是否有這個數,並且這個數出現的次數要大於0,如果大於0,就納入到交集中。
第二種思想就是對兩個陣列進行預處理,把無序變成有序,然後利用雙指標,如果兩者相等,就納入交集,否則就將較小的數的指標往前挪。
程式碼實現
實現一
class Solution { public int[] intersect(int[] nums1, int[] nums2) { HashMap<Integer, Integer> map = new HashMap<>(); for(int i = 0; i < nums1.length; i++){ map.put(nums1[i], map.getOrDefault(nums1[i], 0) + 1); } List<Integer> list = new ArrayList<>(); for(int i = 0; i < nums2.length; i++){ if(map.getOrDefault(nums2[i], 0) != 0){ list.add(nums2[i]); map.put(nums2[i], map.get(nums2[i]) - 1); } } int[] res = new int[list.size()]; for(int i = 0; i < list.size(); i++){ res[i] = list.get(i); } return res; } }
實現二
class Solution { public int[] intersect(int[] nums1, int[] nums2) { List<Integer> list = new ArrayList<>(); Arrays.sort(nums1); Arrays.sort(nums2); int i = 0; int j = 0; while(i < nums1.length && j < nums2.length){ if(nums1[i] == nums2[j]){ list.add(nums1[i]); i++; j++; }else if(nums1[i] < nums2[j]){ i++; }else{ j++; } } int[] res = new int[list.size()]; for(int k = 0; k < list.size(); k++){ res[k] = list.get(k); } return res; } }
總結
一道簡單的題有多種的解法,這對思維的分析十分有用。