zoukankan      html  css  js  c++  java
  • 面试算法 已经排好序的数组中求两个数的和等于N

    已知一个拍好序的数组,长度为M

    在其中找两个数,其和为N

    刚刚拿到这个题目的时候,首先的常规想法是遍历循环求出所有数的和,最终其值为N的就是结果,这个算法时间复杂度为o(N*N)

    可能还有一些扩展的想法,那就是先把数组中比N大的元素去掉,这样少检查几个元素

    这是典型的程序员思维,太早开始考虑实现细节了

    作为一个算法题目首先要把算法复杂度降低下来,然后再考虑常数C。。。不要太早开始考虑这种相对不重要的问题

    由于要寻找的是一个数对,假设这里存在解的话,考虑用N减去数组中的每一个值

    生成一个新数组M2,假设M2的值在M中出现,那么就可以找到解,(用两个指针 一个从M的左边 一个从M2的右边)

    算法复杂度可以做到o(N)

    代码如下

            public static void Test()
    {
    List<int> array = new List<int>() { 1, 2, 3, 4, 5, 6, 5, 6, 565, 33, 35, 7, 9, 33, 4, 12, 13, 14, 15, 16, 17, 18, 19, 02, 234, 23, 45, 46, 48 };
    array.Sort();
    Test1(array.ToArray());
    }
    public static void Test1(int[] array)
    {
    int N = 49;
    int[] array2 = new int[array.Length];

    for (int i = 0; i < array.Length; i++)
    {
    array2[i] = N - array[i];
    }

    int startI = 0;
    int startJ = array.Length - 1;
    while ((startI != array.Length - 1) || (startJ != 0))
    {
    if (array[startI] == array2[startJ])
    {
    Console.Write(startI + ":" + array[startI] + "+" + startJ + ":" + array[startJ]);
    return;
    }
    else if (array[startI] > array2[startJ])
    {
    startJ--;
    }
    else
    {
    startI++;
    }
    }
    }
    }



  • 相关阅读:
    TriSun PDF to X v11.0 Build 061
    资源管理器 Q-Dir v8.09
    USB启动盘创建工具 Rufus
    Docker:网络模式详解
    rsync使用实践
    MySQL 8.0 防止暴力破解
    MySQL-8.0.19 优化日志及压测
    MySQL入门篇之mysqldump参数说明
    rest-framework之视图
    rest-framework之权限组件
  • 原文地址:https://www.cnblogs.com/PurpleTide/p/2300016.html
Copyright © 2011-2022 走看看