LeetCode-探索-初级算法-数组-6. 两个数组的交集 II(个人做题记录,不是习题讲解)
-
语言:java
-
思路:先排序,替换后,使数组2作为最小数组,然后用List存储结果,最后再把List转换为数组,输出
-
代码(45ms,只击败6.8%,丢人):
class Solution { public int[] intersect(int[] nums1, int[] nums2) { Arrays.sort(nums1); Arrays.sort(nums2); int i = 0; int j = 0; int len1 = nums1.length; int len2 = nums2.length; List<Integer> arr = new ArrayList<>(); if(len2>len1){ int[] tmp = nums1; nums1 = nums2; nums2 = tmp; len1 ^= len2; len2 ^= len1; len1 ^= len2; } while(j<len2&&i<len1){ if(nums2[j]==nums1[i]){ arr.add(nums2[j]); ++i; ++j; }else if(nums2[j]>nums1[i]){ ++i; }else{ ++j; } } int[] ints = arr.stream().mapToInt(Integer::valueOf).toArray(); return ints; } }
-
参考代码(2ms):思路和我使差不多的,只不过我做了多余的nums1和nums2的对调步骤,List和int[]的转换
class Solution { public int[] intersect(int[] nums1, int[] nums2) { Arrays.sort(nums1); Arrays.sort(nums2); List<Integer> list = new ArrayList<>(); for (int i = 0, j = 0; i < nums1.length && j < nums2.length; ) { if (nums1[i] < nums2[j]) { i++; } else if (nums1[i] > nums2[j]) { j++; } else { list.add(nums1[i]); i++; j++; } } int[] res = new int[list.size()]; for (int i = 0; i < list.size(); i++) { res[i] = list.get(i); } return res; } }
-
参考后重写(2ms):
class Solution { public int[] intersect(int[] nums1, int[] nums2) { Arrays.sort(nums1); Arrays.sort(nums2); int len1 = nums1.length; int len2 = nums2.length; List<Integer> arr = new ArrayList<>(); for(int i=0,j=0;i<len1&&j<len2;){ if(nums1[i]>nums2[j]){ ++j; }else if(nums1[i]<nums2[j]){ ++i; }else{ arr.add(nums1[i]); ++i; ++j; } } int rlen = arr.size(); int[] res = new int[rlen]; for(int i =0;i<rlen;++i){ res[i] = arr.get(i); } return res; } }