zoukankan      html  css  js  c++  java
  • 求数组的交集,以及贪心算法的使用

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

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

  • 相关阅读:
    HttpInvoker-----服务端实现
    RMI实现-----客户端的实现
    RMI实现-----服务端的实现
    远程服务(RMI)使用示例
    DispatcherServlet的逻辑处理(下篇)
    DispatcherServlet的逻辑处理(上篇)
    SpringMVC-----DispatcherServlet
    SpringMVC-----ContextLoaderListener
    爬取淘宝笔记本电脑数据(一)
    哔哩哔哩自动播放视频
  • 原文地址:https://www.cnblogs.com/tqw1215/p/13329331.html
Copyright © 2011-2022 走看看