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

  • 相关阅读:
    SQL中文转拼音
    cocos2D 虚拟摇杆Joystick功能实现
    cocos2d 粒子效果以及Particle Designer粒子工具的学习
    android 模拟器出错,emulator: ERROR: unknown virtual device name
    [转][越狱破解] 苹果itouch 4 iOS5.0.1完美越狱教程+资源下载
    objectivec 中随机数的用法 (3种:arc4random() 、random()、CCRANDOM_0_1() )
    [转]cocos2dx添加广告条(IOS and Android)
    cocos2d1.0.1x0.10.0版本 设置横屏与竖屏的方法
    【转】总结阐述Cocos2dX与Cocos2diphone区别;
    Objectivec 中CGGeometry几何类常用方法简单整理
  • 原文地址:https://www.cnblogs.com/tqw1215/p/13329331.html
Copyright © 2011-2022 走看看