599. Minimum Index Sum of Two Lists

本文介绍了一种利用HashMap查找两个字符串数组中拥有最小索引和的共同元素的方法,并提供了一个优化过的实现方案。

问题描述:给你两个字符串数组,找出这两个数组中相同字符串对应索引之和最小的字符串。
思路:使用map。
原代码:

    public String[] findRestaurant(String[] list1, String[] list2) {
        String []s=new String[Math.max(list1.length,list2.length)];
        int sum=Integer.MAX_VALUE;
        List<String> list=new ArrayList<String>();
        Map<String,Integer> map=new HashMap<String,Integer>();
        for(int i=0;i<list1.length;i++){
            map.put(list1[i],i);
        }
        int totalNum=0;
        for(int j=0;j<list2.length;j++){
            if(map.containsKey(list2[j])){
                int index=map.get(list2[j])+j;
                if(sum==index){
                    s[totalNum]=list2[j];
                    totalNum++;
                }else if(index<sum){
                    totalNum=0;
                    s[totalNum++]=list2[j];
                    sum=index;
                }
            }
        }
        String[] res=new String[totalNum];
        for(int i=0;i<totalNum;i++){
            res[i]=s[i];
        }
        return res;
    }

最佳答案:

public String[] findRestaurant(String[] list1, String[] list2) {
        if(list1.length>list2.length) return findRestaurant(list2, list1);
        if(list1.length==0) return new String[]{};
        Map<String, Integer> index = new HashMap<>();
        for(int i=0; i<list1.length;i++){
            String rest = list1[i];
            index.put(rest, i);
        }
        int minSum = Integer.MAX_VALUE;
        List<String> potentionalAnser = new ArrayList<>();
        for(int i=0; i<list2.length;i++){
            if(i>minSum) break;
            String rest = list2[i];
            if(index.containsKey(rest) && (i+index.get(rest)<=minSum)){
                if(i+index.get(rest)<minSum){
                    minSum = i+index.get(rest);
                    potentionalAnser = new ArrayList<>();
                }
                potentionalAnser.add(rest);
            }
        }
        String[] result = new String[potentionalAnser.size()];
        return potentionalAnser.toArray(result);
    }

原生的方法要比自己构建数组更快

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值