使用哈希表,C++编写可A代码

最长的可整合子数组的长度

http://www.nowcoder.com/questionTerminal/677a21987e5d46f1a62cded9509a94f2

使用语言:C++
时间复杂度:图片说明
空间复杂度:图片说明

解题思路:
可以先从数组的性质下手,对于一个排好序的数组,如果要让数组中每个相邻元素的差都为1,那么数组的长度一定会等于数组中最大值与最小值的差值。
反过来推导,如果数组的长度等于数组中最大值与最小值的差值,就只有两种情况:
1、数组中存在相等的元素,比如:[2, 3, 4, 4, 6, 7]
2、满足题目需求,数组中每个相邻元素的差都为1,比如:[2, 3, 4, 5, 6]

(可能有些小伙伴会想有没有可能存在第三种可能,假如中间存在两相邻的数之差大于1,比如:[2, 4, 5, 6],但很容易证明这时 最大值与最小值的差值 != 数组长度

所以我们只要排除掉第一种情况,剩下的就是满足题目需求的子数组,而对于查找重复元素的问题,我们首先就会想到哈希表,说到这应该大家都会了吧~

注意:子数组是连续的,且不打乱原数组的排列顺序

代码:

#include <bits/stdc++.h>
using namespace std;

int fun(vector<int>& arr, int n) {
    if(n <= 1)
        return n;

    int res = 1;
    unordered_set<int> nums;

    for(int i = 0; i < n; i ++){
        int max_val = 0, min_val = INT_MAX;
        for(int j = i; j < n; j ++){
            if(nums.find(arr[j])!=nums.end()) // 排除子数组中有重复元素的情况
                break;
            nums.insert(arr[j]);
            // 检测子数组中的最大值与最小值
            max_val = max(max_val, arr[j]);
            min_val = min(min_val, arr[j]);
            // 当最大值与最小值的差等于子数组的长度时,表示子数组中每个数都是相差1
            if(max_val - min_val == j - i)
                res = max(res, j - i + 1);
        }
        nums.clear();
    }
    return res;
}

int main(){
    int n;
    cin>>n;
    vector<int> arr(n);
    for(int i=0;i<n;i++)
        cin>>arr[i];

    cout << fun(arr, n) << endl;
    return 0;
}
全部评论

相关推荐

2025-11-08 21:43
济南大学 Java
1.3000~4000,一般对于双非本来说,hr能给出这种薪资,完完全全是侮辱人,而且我感觉是那种毛病贼多的小公司,遇上脾气不好的,能直接开骂,3-4k真的能招到人吗,属于是拉完了。2.4000~6000,可能是考研失败或者是hr看着是学校确实没那么好给出的价,如果是考研失败想找个地方过度一下准备二战的话,可以去一下,毕竟确实给的不多,校招都给这么点了,长期干的话薪资也不会涨到哪里去,这里给到npc。3.6000~8000,取中位数7k来看,除了某些提前规划大学生活,积累实习进入大厂的,我感觉这是大部分双非本能够拿到的工资,因为不管是boss上还是其他渠道,感觉普通后端开发都是这个数(以山东济南这边的情况来看),如果能双休而且是对口工作的话,这个薪资范围对双非本来说还是可以的,这里给到人上人。4.8000~10000,这个区间来看,感觉超越80%的双非本的同学了,如果你是9k而且双休,那简直是太舒服了,毕竟学历摆在那里,能拿到这个数,已经是“空调wifi冰镇西瓜”的级别了,这里必须夯爆了。5.10~15k,周围的同学极少能拿到这个数,甚至除了进大厂的同学们,很少看到双非本能拿到这个数,当然我指的是普通双非,但是能拿这个数,加班也少不了,而且如果能拿到这个数(相较于9k),那加班我感觉是少不了的,需要天天加班好几个小时,甚至双休都不能保证,但是能拿到这些数了,加会儿班就无可厚非了。第二点,如果能拿到这个薪资,那么这个同学肯定是在学习路上付出了很多的努力来弥补学历上带来的不足。在大学期间需要马不停蹄的来学习,如果也要严重加班的话,那综合来看,我会给到顶级。最后,目前我也是一名应届生,上述也是以山东目前的情况来说(如果是北上广深这样的城市那需要另外斟酌),以自己找工作的经历以及互联网上观察到的双非本的同学的秋招情况来看的,目前也还有好多的同学没有拿到心仪的offer,祝愿同学们拿到自己心仪的工作!!
一天代码十万三:都互联网了,就别看山东情况了
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务