zoukankan      html  css  js  c++  java
  • 两数之和与杨氏矩阵

    两数之和

    暴力解法

    解题思路:

    两个for循环嵌套,暴力枚举两个数字。

    时间复杂度:$O(n^2)$

    空间复杂度:$O(1)$

    for循环+二分查找

    时间复杂度:$O(nlogn)$

    空间复杂度:$O(1)$

    for循环+哈希函数

    时间复杂度:$O(n)$

    空间复杂度:$O(n)$

    双指针法

    左右端分别一个指针,求和结果与目标比较,偏大,右指针左移一位,偏小,左指针右移一位。

    时间复杂度:$O(n)$

    空间复杂度:$O(1)$

    代码实现(C++)

    #include <iostream>
    using namespace std;
    
    int main() {
        int n, t, num[100005];
        for (int i = 1; i <=n; i++) {
            cin >> num[i];
        }
        int l = 1, r = n;
        while (l < r) {
            int sum = num[l] + num[r];
            if (t == sum) {
                cout << l << " " << r << endl;
                return 0;
            }
            if (t < sum) {
                r--;
            } else {
                l++;
            }
        }
        cout << -1 << endl;
        return 0;
    }

    扩展:杨氏矩阵的查找

    杨氏矩阵:从左到右,从上到下,数组元素的值单调递增。

    核心思想:从左下角右上角开始比较查找。

    时间复杂度:$O(n+m)$

    代码实现(C++)

    #include <iostream>
    using namespace std;
    
    int main() {
        int n , m , num[105][105], t;
        cin >> n >> m;
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                 cin >> num[i][j];
            }    
        }
        cin >> t;
        int x = n, y = 1;
        while (x >= 1 && y <= m) {
            if (num[x][y] == t) {
                cout << x << " " << y << endl;
                return 0;
            }
            if (num[x][y] > t) {
                x--;
            } else {
                y++;
            }
        }
        cout<< -1 << endl;
        return 0;    
    }

    杨氏矩阵的查找思想与双指针法其实异曲同工

    Min是清明的茗
  • 相关阅读:
    类的关联关系
    VisualStudio.DTE 对象可以通过检索 GetService() 方法
    openssl 安装
    反射的效率
    Ascll
    关于JavaScript 原型的理解
    asp.net MVC 学习笔记
    CSS3样式
    List<T>转DataTable
    SQL中的多表联查(SELECT DISTINCT 语句)
  • 原文地址:https://www.cnblogs.com/MinPage/p/14053546.html
Copyright © 2011-2022 走看看