力扣 数据结构基础(3)

100 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

8.杨辉三角(o)

给定一个非负整数 numRows 生成「杨辉三角」的前 numRows **行。

在「杨辉三角」中,每个数是它左上方和右上方的数的和。

输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]

我们可以一行一行地计算杨辉三角。每当我们计算出第 iii 行的值,我们就可以在线性时间复杂度内计算出第 i+1i+1i+1 行的值

class Solution {
public:
    vector<vector<int>> generate(int numRows) {
        vector<vector<int>> ret(numRows);
        for (int i = 0; i < numRows; ++i) {
            ret[i].resize(i + 1);
            ret[i][0] = ret[i][i] = 1;
            for (int j = 1; j < i; ++j) {
                ret[i][j] = ret[i - 1][j] + ret[i - 1][j - 1];
            }
        }
        return ret;
    }
};

9.有效的数独

10.矩阵置零

给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法 (输入的资料通常会被要输出的部分覆盖掉)

 

我们可以用两个标记数组分别记录每一行和每一列是否有零出现。

 

具体地,我们首先遍历该数组一次,如果某个元素为 000,那么就将该元素所在的行和列所对应标记数组的位置置为 true。最后我们再次遍历该数组,用标记数组更新原数组即可。

简单来说,就是先找元素为0的点,将其的行列数标记为true,再遍历,有一个相同的行列数就返回为true

使之赋值为0‘

代码如下

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        int m = matrix.size();
        int n = matrix[0].size();
        vector<int> row(m), col(n);
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (!matrix[i][j]) {
                    row[i] = col[j] = true;
                }
            }
        }
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (row[i] || col[j]) {
                    matrix[i][j] = 0;
                }
            }
        }
    }
};

11.字符串中第一个唯一字符

给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。

分析样例,是从0开始索引的

思路:两次遍历,第一次先统计各个字符出现的次数

第二次遍历到只出现一次的字符就返回索引

根据官方题解

class Solution {
public:
    int firstUniqChar(string s) {
        unordered_map<int, int> frequency;
        for (char ch: s) {
            ++frequency[ch];
        }
        for (int i = 0; i < s.size(); ++i) {
            if (frequency[s[i]] == 1) {
                return i;
            }
        }
        return -1;
    }
};