一、计算两个数组的交集
解题思路:
- 将两个数组转化为HashSet集合,保证元素的唯一性
- 新建一个大小可变的集合用来储存元素
- 循环遍历两个HashSet集合,找出交集中包含的元素并添加到新建的集合中
代码:
class Solution { public int[] intersection(int[] nums1, int[] nums2) { if(nums1.length <= 0 || nums2.length <= 0){ return new int[0]; } HashSet<Integer> set1 = new HashSet<Integer>(); for(int i = 0; i < nums1.length; i++){ set1.add(nums1[i]); } HashSet<Integer> set2 = new HashSet<Integer>(); for(int i = 0; i < nums2.length; i++){ set2.add(nums2[i]); } HashSet<Integer> set3 = new HashSet<Integer>(); for (Integer value1 : set1) { if (set2.contains(value1)){ set3.add(value1); } } int[] arr = new int[set3.size()]; if(set3.size() <= 0){ return arr; } int i = 0; for(Integer value3 : set3){ arr[i] = value3; i++; } return arr; } }
遍历循环优化:
1.提取与循环无关的表达式
for (int i = 0; i < 10000000; i++) { i=i*a*b; }
//应改为
c = a*b; for (int i = 0; i < 10000000; i++) { i=i*c; }
2.消除循环终止判断时的方法调用
for (int i = 0; i < list.size(); i++) { }
//应改为
int size = list.size(); for (int i = 0; i < size; i++) { }
3.异常捕获
for (int i = 0; i < 10000000; i++) { try { } catch (Exception e) { } }
//应改为
try { for (int i = 0; i < 10000000; i++) { } } catch (Exception e) { }
二、给你一个整数数组arr。你可以从中选出一个整数集合,并删除这些整数在数组中的每次出现。返回至少能删除数组中的一半整数的整数集合的最小大小。
解题思路:
- 取出所有元素,储存在map集合中,key唯一,value递增
- 对map中的value进行排序,倒序排列
- 逐步增加从list中取元素,每次加1,从0开始,判断取出来的元素的总和是否大于等于原数组的一半
class Solution { public int intersection(int[] nums1) { //1.取出所有元素,储存在map集合中,key唯一,value递增 HashMap<Integer,Integer> map1 = new HashMap<Integer, Integer>(); for (int key : nums1){ map1.merge(key, 1, (prev, one) -> prev + one); } //2.对map中的value进行排序,倒序排列 ArrayList<Integer> list = new ArrayList<Integer>(map1.values()); list.sort(new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { if (o1 > o2){ return -1; }else if(o1 == o2){ return 0; }else{ return 1; } } }); int currentCount = 0; //3.逐步增加从list中取元素,每次加1,从0开始,判断取出来的元素的总和是否大于等于原数组的一半 int size = list.size(); int targetCount = 0; if(nums1.length % 2 == 0){ targetCount = (nums1.length/2); }else{ targetCount = (nums1.length/2) + 1; } for (int i = 0; i < size; i++){ currentCount += list.get(i); if(currentCount >= targetCount){ return i+1; } } return 0; } }
Merge的用法: