
这道题和349很相似,同样是求交集,但是要求有所不同。输出结果中的元素可以重复,输出数组可以无序。
解法一:使用哈希表
用哈希表来建立nums1中字符和其出现个数之间的映射, 然后遍历nums2数组,如果当前字符在哈希表中的个数大于0,则将此字符加入结果中,然后哈希表的对应值自减1,参见代码如下:
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
HashMap<Integer,Integer> map = new HashMap<Integer, Integer>();
for(Integer num: nums1)
map.put(num, map.getOrDefault(num, 0) + 1);
int count = 0;
for (Integer num : nums2) {
if (map.containsKey(num) && map.get(num) > 0) {
nums1[count++] = num;
map.put(num, map.get(num) - 1);
}
}
return Arrays.copyOf(nums1, count);
}
}
几个关键点总结:
- 由于输出数组中的元素可以重复且无序,数据那么数据结构选择哈希表HashMap。
2. map.put(num, map.getOrDefault(num, 0) + 1); //如果没有这个元素,则加入该元素,并且将出现次数设为1,若已有该元素,给元素数量加1。一种很简洁很方便的方法。Map.getOrDefault(Object key, V defaultValue)方法:当Map集合中有这个key时,就使用这个key值,如果没有就使用默认值defaultValue。
3.该代码最后返回的时候使用了数组的拷贝的方式。Arrays.copyOf(array, count)。
解法二:排序+双指针
解题思路:
1)对数组nums1进行排序;
2)对数组nums2进行排序;
3)遍历数组nums1和nums2中元素,并比较对应的元素,
若相等,则将其保存到输出结果中,并变化两个数组对应的索引
不等,则变化较小元素对应的索引即可。代码如下:
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
Arrays.sort(nums1);
Arrays.sort(nums2);
ArrayList result = new ArrayList();
for(int i =0, j = 0; i < nums1.length && j < nums2.length; ){
if(nums1[i] == nums2[j]){
result.add(nums1[i]);
i++;
j++;
}
else if(nums1[i] < nums2[j]){
i++;
}
else
j++;
}
int[] res = new int[result.size()];
for(int i = 0; i < result.size(); i++){
res[i] = (int) result.get(i);
}
return res;
}
}
几个关键点总结:
- 利用Arrays.sort方法直接对数据排序
- 双指针的思想
.
网友评论