当前位置: 首页 > article >正文

最大和值距离

在这里插入图片描述

官方题解哈希

在这里插入图片描述

  • 初始化哈希数组:
    • 使用一个大小为11的数组 leftIdx 来记录每个数字第一次出现的索引,初始值为 -1。
    • 数组大小为11是因为题目假设数组中的元素范围在 1 到 10 之间。
  • 遍历数组:
    • 使用一个变量 ans 来记录满足条件的最大索引差,初始值为 0。
    • 从左到右遍历数组中的每个元素 nums[i]。
    • 对于每个元素 nums[i],计算其与目标和 x 的差值 k = x - nums[i]
    • 检查 k 是否在 1 到 10 之间,并且 leftIdx[k] 是否不为 -1。
    • 如果条件满足,计算索引差 i - leftIdx[k],并更新 ans。
    • 如果 leftIdx[nums[i]] 为 -1,则记录 nums[i] 第一次出现的索引。
  • 返回结果:
    • 返回 ans,即满足条件的最大索引差。
#include <bits/stdc++.h>
using namespace std;

/* 完成下面的函数 */
int findMaxIndexDifference(const vector<int>& nums, int n, int x) {
    vector<int> leftIdx(11, -1); // 全都初始化为-1
    int ans = 0;
    for( int i = 0; i < nums.size(); i++) {
        int k = x - nums[i];  // k是和当前元素匹配的元素
        if(k >= 1 && k <= 10 && leftIdx[k] !=-1) {
            ans = max(ans, i - leftIdx[k]); // ans是最大下标之差
        }
        if(leftIdx[nums[i]] == -1) {
            leftIdx[nums[i]] = i; // 把与nums[i]匹配的元素的
        }
    }
    return ans;
}

int main() {
    int n, x;
    cin >> n >> x;
    vector<int> nums(n);
    for (int i = 0; i < n; ++i) {
        cin >> nums[i];
    }

    int result = findMaxIndexDifference(nums, n, x);
    cout << result << endl;

    return 0;
}

例子模拟

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

直接计算并记录最大索引差

  • 设置一个最大索引差变量
  • 遍历数组中的所有配对。
  • 对于每个配对,检查它们的和是否等于给定值 x。
  • 如果等于 x,计算它们的索引差并更新最大索引差。
  • 返回最大索引差。
#include <bits/stdc++.h>
using namespace std;

int findMaxIndexDifference(const vector<int>& nums, int n, int x) {
    int max_diff = -1; // 初始化最大索引差为-1,表示未找到配对
    for (int i = 0; i < n; ++i) {
        for (int j = i + 1; j < n; ++j) {
            if (nums[i] + nums[j] == x) {
                int diff = abs(i - j);
                if (diff > max_diff) {
                    max_diff = diff;
                }
            }
        }
    }
    return max_diff;
}

int main() {
    int n, x;
    cin >> n >> x;
    vector<int> nums(n);
    for (int i = 0; i < n; ++i) {
        cin >> nums[i];
    }

    int result = findMaxIndexDifference(nums, n, x);
    cout << result << endl;

    return 0;
}

时空复杂度巨大无法AC版,使用数组存放所有满足条件的索引差,然后使用STL取出最大值

(用来熟悉一下vector的STL)

  • 遍历数组中的所有配对。
  • 对于每个配对,检查它们的和是否等于给定值 x。
  • 如果等于 x,计算它们的索引差并存放在数组中。
  • 使用STL的 max_element 函数取出数组中的最大值。
  • 返回最大值。
#include <bits/stdc++.h>
using namespace std;

int findMaxIndexDifference(const vector<int>& nums, int n, int x) {
    vector<int> index_diffs; // 用于存放满足条件的索引差
    for (int i = 0; i <= n - 2; ++i) {
        for (int j = i + 1; j <= n - 1; ++j) {
            if (nums[i] + nums[j] == x) {
                int diff = abs(i - j);
                index_diffs.push_back(diff);
            }
        }
    }
    if (index_diffs.empty()) {
        return -1; // 如果没有找到满足条件的配对,返回-1
    }
    return *max_element(index_diffs.begin(), index_diffs.end()); // 使用STL取出最大值
}

int main() {
    int n, x;
    cin >> n >> x;
    vector<int> nums(n);
    for (int i = 0; i < n; ++i) {
        cin >> nums[i];
    }

    int result = findMaxIndexDifference(nums, n, x);
    cout << result << endl;

    return 0;
}

遍历思路优化:aj从右往左,遇到即停

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

/* 完成下面的函数 */
int findMaxIndexDifference(const vector<int>& nums, int n, int x) {
    int max_diff = -1; // 初始化最大索引差为-1,表示未找到配对
    for (int i = 0; i <= n - 2; ++i) {
        for (int j = n - 1; j > i; --j) { // 从右向左遍历
            if (nums[i] + nums[j] == x) {
                int diff = abs(i - j);
                if (diff > max_diff) {
                    max_diff = diff;
                }
                break; // 找到满足条件的配对后提前退出内层循环
            }
        }
    }
    return max_diff;
}

int main() {
    int n, x;
    cin >> n >> x;
    vector<int> nums(n);
    for (int i = 0; i < n; ++i) {
        cin >> nums[i];
    }

    int result = findMaxIndexDifference(nums, n, x);
    cout << result << endl;

    return 0;
}

注意那里是break 不是continue
在这里插入图片描述

2024年11月9日15:00:25

来复习一下
在这里插入图片描述
这次找了个不是递增的例子
我们再来捋一遍

对于第一个元素3
与他匹配的元素是4
若4已经出现,那么leftIdx[4]中不是-1
而是4在nums[i]中的索引

所以不更新ans

对于第二个元素4
和他匹配的元素3
检测到leftIdx[3]中不是0,说明已经出现了(在其左边出现)

于是ans可以更新 了

对于5,2还没出现,不更新ans
但是更新leftIdx[5]=5在nums中的索引
对于1 ,6没出现
对于2 ,5出现了,更新ans

对于3 ,4出现了,更细ans
对于4,5出现了,更新ans
对于5,2


http://www.kler.cn/a/387857.html

相关文章:

  • request爬虫库的小坑
  • 【再谈设计模式】抽象工厂模式~对象创建的统筹者
  • react的创建与书写
  • 工业相机选取
  • kettle开发-Day43-数据对比
  • #渗透测试#SRC漏洞挖掘#云技术基础02之容器与云
  • WPF MVVM入门系列教程(三、数据绑定)
  • IDEA中新建与切换Git分支
  • 大数据-208 数据挖掘 机器学习理论 - 岭回归 和 Lasso 算法 原理
  • “单元测试”应该怎么写比较好
  • webpack 执行流程 — 实现 myWebpack
  • L1-4【例7-4①】 求最小值及其下标
  • ArrayList扩容机制
  • vue链接跳转
  • bert-base-uncased使用
  • 阐述对于鸿蒙生态未来的发展趋势的看法
  • 智慧教学资源管理:SpringBoot与Vue的强强联合
  • 15分钟学 Go 第 42 天:RESTful API设计
  • 【入门篇】确定字符串是否包含唯一字符——多语言版本
  • 机器学习系列----深入理解Transformer模型
  • C++顶层const与底层const
  • 【需求变更】使用 Redis 和 Lua 脚本实现变更后方案编号的生成
  • Linux下通过sqlplus连Oracle提示字符是乱码▒▒▒[
  • 什么是 eCPRI,它对 5G 和 Open RAN 有何贡献?
  • 设计模式-七个基本原则之一-迪米特法则 + 案例
  • 【WRF模拟】全过程总结:WPS预处理及WRF运行