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

一、题目

D13 LeetCode 599.两个列表的最小索引和(简单)_第1张图片

二、思路(自己)

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

class Solution {
    public  String[] findRestaurant(String[] list1, String[] list2) {
       // Map map=new TreeMap<>();
        List res=new ArrayList<>();
        //找出两个数组中相同的口味
        for (int i = 0; i < list1.length; i++) {
            String s1=list1[i];
            for (int j = 0; j  ans=new ArrayList<>();
        ans.add(s3.substring(1));
        for (int i = 1; i 

D13 LeetCode 599.两个列表的最小索引和(简单)_第2张图片

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

D13 LeetCode 599.两个列表的最小索引和(简单)_第3张图片

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

三、题解(官方)

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

        List ret = new ArrayList();
        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()]);
    }
}

你可能感兴趣的:(LeetCode,leetcode,算法,职场和发展)