D13 LeetCode 599.两个列表的最小索引和(简单)

博主分享了解决LeetCode餐厅推荐问题的Java代码优化过程,从使用List和sort到利用HashMap实现更高效地查找和排序。学习了Java比较器和哈希表在解决复杂度问题上的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、题目

二、思路(自己)

  • 先遍历两个数组,找出元素值相等的元素同时记录下标和,这时候我想到了要用到map,但是map不允许键值重复,我就一直在纠结怎么不让他更新或者记录相等键的元素值。然后想破了头也没想清楚,最后想着用list来记录,把 下标和放在字符串前面,然后通过sort工具类的排序算法可以把他们按照下标的大小升序排列,但是我没想到的是如果下标和是两位数的话,那就行不通了,如下代码:

class Solution {
    public  String[] findRestaurant(String[] list1, String[] list2) {
       // Map<Integer,String> map=new TreeMap<>();
        List<String> res=new ArrayList<>();
        //找出两个数组中相同的口味
        for (int i = 0; i < list1.length; i++) {
            String s1=list1[i];
            for (int j = 0; j <list2.length ; j++) {
                String s2=list2[j];
                if(s1.equals(s2)){
                    int sum=i+j;
                    String s=sum+s1;
                    res.add(s);
                }
            }
        }
        Collections.sort(res);
     //   System.out.println(res);
        String s3=res.get(0);
        int first= Integer.parseInt(s3.substring(0,1));
        List<String> ans=new ArrayList<>();
        ans.add(s3.substring(1));
        for (int i = 1; i <res.size() ; i++) {
            int s4= Integer.parseInt(res.get(i).substring(0,1));
            if(s4!=first)
                break;
            else ans.add(res.get(i).substring(1));
        }
       // System.out.println(ans);
        String[] s5=new String[ans.size()];
        return ans.toArray(s5);
    }
}

  •  KFC下标和为11,导致在比较时只比较了1,所以输出错误。
  • 现在的修改方法是,我觉得用list这条路行不通,还是用map进行存储,键为口味,值为下标和,修改比较器即可实现了。
  • 后发现原来treemap不能直接通过值来进行排序,只能通过把TreeMap的EntrySet转换成list,然后使用Collections.sort排序,说做就做
class Solution {
    public String[] findRestaurant(String[] list1, String[] list2) {
        Map<String,Integer> map=new TreeMap<>();
      //  List<String> res=new ArrayList<>();
        //找出两个数组中相同的口味
        for (int i = 0; i < list1.length; i++) {
            String s1=list1[i];
            for (int j = 0; j <list2.length ; j++) {
                String s2=list2[j];
                if(s1.equals(s2)){
                    map.put(list1[i],i+j);
                    break;
                }
            }
        }
        List<Map.Entry<String,Integer>> res=new ArrayList<>(map.entrySet());
        Collections.sort(res,(o1,o2)->o1.getValue().compareTo(o2.getValue()));
        int first=res.get(0).getValue();
        List<String> l=new ArrayList<>();
        l.add(res.get(0).getKey());
        for (int i = 1; i <res.size() ; i++) {
            if(res.get(i).getValue()!=first) break;
            l.add(res.get(i).getKey());
        }
        String[] s=new String[l.size()];
        return l.toArray(s);
    }
}

  • 这个题目官方定义的难度是简单,其实是挺简单的,但是由于我对Java比较器不够熟悉,导致废了一些功夫,花了将近两个小时才完成。不过通过这个题目我学到了集合比较器的使用和修改,再接再厉!
  • 写完看看评论区大佬们的解答,果然我还是太菜了,加油加油!!!

三、题解(官方)

  • 官方用的题解是哈希表index,先遍历list1,然后再查找list2中元素是否存在于index中,存在的话就是有相同口味的餐厅,记录下标和
class Solution {
    public String[] findRestaurant(String[] list1, String[] list2) {
        Map<String, Integer> index = new HashMap<String, Integer>();
        for (int i = 0; i < list1.length; i++) {
            index.put(list1[i], i);
        }

        List<String> ret = new ArrayList<String>();
        int indexSum = Integer.MAX_VALUE;
        for (int i = 0; i < list2.length; i++) {
            if (index.containsKey(list2[i])) {
                int j = index.get(list2[i]);
                if (i + j < indexSum) {
                    ret.clear();
                    ret.add(list2[i]);
                    indexSum = i + j;
                } else if (i + j == indexSum) {
                    ret.add(list2[i]);
                }
            }
        }
        return ret.toArray(new String[ret.size()]);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值