LeetCode1346 检查整数及其两倍数是否存在

发布于:2025-02-10 ⋅ 阅读:(59) ⋅ 点赞:(0)

《LeetCode 题目:检查数组中是否存在两倍关系的元素》

在编程学习的道路上,刷算法题是提升能力的关键一环。今天就来和大家分享一道有趣的 LeetCode 题目:给定一个整数数组 arr,需要检查是否存在两个整数 N 和 M,满足 N 是 M 的两倍(即,N = 2 * M),更正式地,检查是否存在两个下标 i 和 j 满足:i!= j,0 <= i, j < arr.length,arr[i] == 2 * arr[j]。

一、题目分析

这道题看似简单,实则需要仔细考虑如何高效地遍历数组来找出满足条件的元素对。最直接的思路就是暴力解法,通过两层循环遍历数组中的每一个元素组合,逐一判断是否符合要求。

二、代码实现

#include <stdio.h>
#include <stdbool.h>

bool checkIfExist(int* arr, int arrSize) {
    for (int i = 0; i < arrSize; i++) {
        for (int j = 0; j < arrSize; j++) {
            if (i!= j && arr[i] == 2 * arr[j]) {
                return true;
            }
        }
    }
    return false;
}

int main() {
    int arr[] = { 1, 2, 3, 4 };
    int arrSize = sizeof(arr) / sizeof(arr[0]);
    bool result = checkIfExist(arr, arrSize);
    if (result) {
        printf("存在满足条件的两个整数\n");
    }
    else {
        printf("不存在满足条件的两个整数\n");
    }
    return 0;
}
  • 外层的 for 循环 for (int i = 0; i < arrSize; i++),它从数组的起始位置开始,以索引 i 逐个访问数组元素,控制着第一个参与比较的元素。
  • 内层的 for 循环 for (int j = 0; j < arrSize; j++),同样遍历整个数组,以索引 j 选取第二个参与比较的元素。
  • 当 i 和 j 不相等(确保不是同一个元素)且 arr[i] 恰好等于 2 * arr[j] 时,就找到了满足条件的一对元素,此时直接返回 true。若两层循环结束都未找到符合条件的,就返回 false。

三、算法复杂度分析

  • 时间复杂度:由于使用了两层嵌套循环,对于长度为 n 的数组,总共需要进行 n * n 次比较操作,所以时间复杂度为O(n^{2}) 。这意味着随着数组规模的增大,运行时间会以平方的速度增长,效率相对较低,当数组很大时可能会耗时较长。
  • 空间复杂度:在整个函数执行过程中,除了传入的数组本身占用的空间外,只额外使用了几个有限的变量(如 i、j 等用于循环计数),它们所占用的空间不随数组规模变化而变化,所以空间复杂度为 O(1),属于非常节省空间的算法。

五、总结

这道题虽然可以用简单粗暴的暴力解法解决,但它也引发我们思考是否有更优化的算法。在实际编程和算法学习中,遇到类似问题,既要掌握基础的解法,也要不断探索降低时间复杂度、提高效率的方法,这样才能在面对更复杂的问题时游刃有余。希望大家通过这道题的学习,对数组遍历和条件判断有更深入的理解,后续我们还会分享更多精彩的算法题目,敬请期待!


网站公告

今日签到

点亮在社区的每一天
去签到