zoukankan      html  css  js  c++  java
  • lintcode:两数组的交 II

    题目

    计算两个数组的交

     注意事项

    每个元素出现次数得和在数组里一样
    答案可以以任意顺序给出

    样例

    nums1 = [1, 2, 2, 1], nums2 = [2, 2], 返回 [2, 2].

    解题

    参考上道题,这道题只是不需要去重,直接把上道题去重部分程序去除就ok

    public class Solution {
        /**
         * @param nums1 an integer array
         * @param nums2 an integer array
         * @return an integer array
         */
        public int[] intersection(int[] nums1, int[] nums2) {
            // Write your code here
            Arrays.sort(nums1);
            Arrays.sort(nums2);
            ArrayList<Integer> A = new ArrayList<Integer>();
            int i=0;
            int j=0;
            while(i<nums1.length && j<nums2.length ){
                if(nums1[i] == nums2[j]){
                    A.add(nums1[i]);
                    i++;
                    j++;
                    
                }else if(nums1[i] < nums2[j]){
                    i++;
                }else{
                    j++;
                }
                
            }
            int[] res = new int[A.size()];
            for( i=0;i<A.size();i++){
                res[i] = (int)A.get(i);
            }
            return res;
        }
    }

    HashMap记录数组1中相同元素出现的次数,数组2找相同,相同次数-1,为0的时候就不是交的部分了

    这个HashMap是一个中间存储,方便找到相同元素

    public class Solution {
        /**
         * @param nums1 an integer array
         * @param nums2 an integer array
         * @return an integer array
         */
        public int[] intersection(int[] nums1, int[] nums2) {
            // Write your code here
            HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
            
            for(int i =0;i<nums1.length;i++){
                if(!map.containsKey(nums1[i])){ // 唯一映射
                    map.put(nums1[i],1);
                }else{
                    map.put(nums1[i],map.get(nums1[i])+ 1 );
                }
            }
            ArrayList<Integer> A = new ArrayList<Integer>();
            for(int i=0;i<nums2.length;i++){
                if(map.containsKey(nums2[i])){ // 相同元素
                    A.add(nums2[i]);
                    map.put(nums2[i],map.get(nums2[i])- 1 );
                    if(map.get(nums2[i])==0)
                        map.remove(nums2[i]); // 去除相同元素
                }
            }
            int[] res = new int[A.size()];
            for(int i=0;i<A.size();i++){ // 保存到数组中
                res[i] = A.get(i);
            }
            return res;
        }
    }

     更新

    public class Solution {
        /**
         * @param nums1 an integer array
         * @param nums2 an integer array
         * @return an integer array
         */
        public int[] intersection(int[] nums1, int[] nums2) {
            // Write your code here
            if(nums1==null || nums2 ==null)
                return new int[]{};
            HashMap<Integer,int[]> map = new HashMap<Integer,int[]>();
            List<Integer> list = new ArrayList<Integer>();
            for(int i=0;i<nums1.length;i++){
                int[] value = map.get(nums1[i]);
                if(value == null){
                    map.put(nums1[i],new int[]{1});
                }else{
                    value[0]++;
                }
            }
            for(int i=0;i<nums2.length;i++){
                int[] value = map.get(nums2[i]);
                if(value!=null && value[0]>=1){
                    list.add(nums2[i]);
                    value[0]--;
                }
            }
            int[] A = new int[list.size()];
            for(int i=0;i<list.size();i++){
                A[i] = list.get(i);
            }
            return A;
        }
    }

     自定义value

    public class Solution {
        /**
         * @param nums1 an integer array
         * @param nums2 an integer array
         * @return an integer array
         */
        public int[] intersection(int[] nums1, int[] nums2) {
            // Write your code here
            if(nums1==null || nums2 ==null)
                return new int[]{};
            HashMap<Integer,Value> map = new HashMap<Integer,Value>();
            List<Integer> list = new ArrayList<Integer>();
            for(int i=0;i<nums1.length;i++){
                Value value = map.get(nums1[i]);
                
                if(value == null){
                    map.put(nums1[i],new Value(1));
                }else{
                    int v = value.getValue();
                    value.setValue(v+1);
                }
            }
            for(int i=0;i<nums2.length;i++){
                Value value = map.get(nums2[i]);
                if(value!=null){
                    int v = value.getValue();
                    if(v>=1){
                        list.add(nums2[i]);
                        value.setValue(v-1);    
                    }
                    
                }
            }
            int[] A = new int[list.size()];
            for(int i=0;i<list.size();i++){
                A[i] = list.get(i);
            }
            return A;
        }
        public class Value{
            int i;
            Value(int i){
                this.i = i;
            }
            public void setValue(int i){
                this.i = i;
            }
            public int getValue(){
                return i;
            }
        }
    }
  • 相关阅读:
    P1246 编码
    P2638 安全系统
    P3913 车的攻击
    P2789 直线交点数
    What?100%基于深度强化学习的对冲基金
    AI | 重磅推荐!哥大开源“FinRL”:一个用于量化金融自动交易的深度强化学习库
    神经霍克斯过程:一个基于神经网络的自调节多变量点过程
    量化都玩IPU了?Man Group-Oxford研究所给你答案
    为什么数字资产生态系统能够增长到2万亿美元以上?
    ICML 获奖者陆昱成:去中心化机器学习的理论极限在哪里?
  • 原文地址:https://www.cnblogs.com/bbbblog/p/5649021.html
Copyright © 2011-2022 走看看