力扣刷题——599. 两个列表的最小索引总和

题目:来源于力扣
在这里插入图片描述

分析:
看完题目后,我最先想到的是用哈希表,但是我在准备一场机试,机试的编译环境不能使用哈希表。

所以我又想到了暴力求解(●ˇ∀ˇ●)

**思路:**两个for循环,外层控制 list1,内层控制 list2,把 两个vector容器中相同字符串 索引之和 的 最小值求出。然后再用两个for循环找到和该最小值相同的 字符串下标,之后存入vector容器中

中间有想到过用 set_intersection求两个容器的交集,但是使用 set_intersection 要求两个容器的数据是有序排列的。这题的索引是固定的,不能改,因此不适用。

好了,话不多说,看看代码吧!

class Solution {
public:
    vector<string> findRestaurant(vector<string>& list1, vector<string>& list2) {
        //哎呀,还是得暴力求解吗?
        vector<string> vTarget;	//返回值

        int min_index = 2001;

        for (int i = 0; i < list1.size(); ++i) {
            for (int j = 0; j < list2.size(); ++j) {
                if (list1[i] == list2[j]) {
                    min_index = min(min_index, i + j);
                }
            }
        }

        for (int i = 0; i < list1.size(); ++i) {
            for (int j = 0; j < list2.size(); ++j) {
                if (i + j == min_index && list1[i] == list2[j]) {
                    vTarget.emplace_back(list1[i]);
                }
            }
        }

        return vTarget;
    }
};

接下来,再用哈希表实现一下吧!

clear()函数用于清空容器,之前听过,不怎么用,现在就当知道了

class Solution {
public:
    vector<string> findRestaurant(vector<string>& list1, vector<string>& list2) {
        vector<string> vTarget;	//返回值

        int min_index = 2001;

        map<string, int> m;

        //将list1的字符串放入map中
        for (int i = 0; i < list1.size(); ++i) {
            m.insert(make_pair(list1[i],i));
        }

        //找list2中 在map中已有的字符串,找到list2中的下标
        //计算i+j,和min_index比较
        //如果i+j 小于 min_index,说明该索引之和还不是最小,清空容器,把索引之和最小的字符串放入

        for (int i = 0; i < list2.size(); ++i) {
            
            //如果在list2找到 和 map 中的字符串配对
            if (m.count(list2[i]) > 0) {
                int j = m[list2[i]];
                if (i + j < min_index) {
                    vTarget.clear();
                    vTarget.emplace_back(list2[i]);
                    min_index = i + j;
                }
                else if(i+j == min_index) {
                    vTarget.emplace_back(list2[i]);
                }
            }
        }
        
        return vTarget;
    }
};

今天还剩4道题,加油啊!

( •̀ ω •́ )✧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值