求数组的交集,以及贪心算法的使用

一、计算两个数组的交集
解题思路:

  • 将两个数组转化为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的用法: 

https://juejin.im/post/5c944f866fb9a070bd599fea

贪心算法详解:
https://zhuanlan.zhihu.com/p/53334049

原文地址:https://www.cnblogs.com/tqw1215/p/13329331.html