力扣8.28

219.存在重复元素Ⅱ

题目

给你一个整数数组 nums 和一个整数 k,判断数组中是否存在两个 不同的索引 ij ,满足 nums[i] == nums[j]abs(i - j) <= k 。如果存在,返回true ;否则,返回 false

数据范围
  • 1 <= nums.length <= 105
  • -109 <= nums[i] <= 109
  • 0 <= k <= 105
分析

双指针+map

代码
c 复制代码
class Solution {
public:
    map<int, int> cnt;
    bool containsNearbyDuplicate(vector<int>& nums, int k) {
        int l = 0, r = 0;
        int t = min(k, (int)nums.size());
        for(int i = 0; i < t; i ++ ) {
            cnt[nums[i]] ++ ;
            if(cnt[nums[i]] >= 2) return true;
        }
        r = t;
        while(l < r && r < nums.size()) {
            if(cnt[nums[r]] >= 1) {
                return true;
            }else {
                cnt[nums[r ++ ]] ++ ;
                cnt[nums[l ++ ]] -- ;
            }
        }
        return false;
    }
};

73.矩阵置零

题目

给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。

数据范围
  • m == matrix.length
  • n == matrix[0].length
  • 1 <= m, n <= 200
  • -2^31 <= matrix[i][j] <= 2^31 - 1
分析

对于a[i][j]==0,将其所在行和列置0等价于先将a[i][0]a[0][j]置为0,再将a[i][0]所在行和a[0][j]所在列置为0,所以第一轮扫描就可以将每个0元素行和列的开头置为0作为标记,然后第二轮扫描再将对应行和对应列的元素设置为0,需要注意的是,若第一行和第一列本来就有零元素,也需要做个标记,并在最后的时候将第一行和第一列置为0,注意一下细节,例如第一轮扫描时需要避开第一行和第一列,否则会影响到第二轮置零操作

代码
c 复制代码
class Solution {
public:
   void print(int n, int m, vector<vector<int>>& matrix) {
    for(int i = 0; i < n; i ++ ) {
        for(int j = 0; j < m; j ++ ) {
            cout << matrix[i][j] << " ";
        }
        cout << endl;
    }
    }
    void setZeroes(vector<vector<int>>& matrix) {
        bool flagx = false, flagy = false;
        int n = matrix.size();
        int m = matrix[0].size();
        for(int i = 0; i < n; i ++ ) {
            if(matrix[i][0] == 0) flagx = true;
        }
        for(int i = 0; i < m; i ++ ) {
            if(matrix[0][i] == 0) flagy = true;
        }
        for(int i = 0; i < n; i ++ ) {
            for(int j = 0; j < m; j ++ ) {
                if(!i || !j) continue;
                if(!matrix[i][j]) { 
                    matrix[i][0] = 0;
                    matrix[0][j] = 0;
                }
            }
        }

        for(int i = 1; i < n; i ++ ) {
            if(!matrix[i][0]) {
                for(int j = 0; j < m; j ++ ) {
                    matrix[i][j] = 0;
                }
            } 
        }
        for(int i = 1; i < m; i ++ ) {
            if(!matrix[0][i]) {
                for(int j = 0; j < n; j ++ ) {
                    matrix[j][i] = 0;
                }
            }
        }
        if(!matrix[0][0]) {
            for(int i = 0; i < n; i ++ ) matrix[i][0] = 0;
            for(int i = 0; i < m; i ++ ) matrix[0][i] = 0;
        }
        if(flagx) {
            for(int i = 0; i < n ;i ++ ) {
                matrix[i][0] = 0;
            }
        }
        if(flagy) {
            for(int i = 0; i < m; i ++ ) {
                matrix[0][i] = 0;
            }
        }
    }
};
相关推荐
火星机器人life1 小时前
基于ceres优化的3d激光雷达开源算法
算法·3d
虽千万人 吾往矣1 小时前
golang LeetCode 热题 100(动态规划)-更新中
算法·leetcode·动态规划
arnold662 小时前
华为OD E卷(100分)34-转盘寿司
算法·华为od
ZZTC2 小时前
Floyd算法及其扩展应用
算法
lshzdq2 小时前
【机器人】机械臂轨迹和转矩控制对比
人工智能·算法·机器人
2401_858286113 小时前
115.【C语言】数据结构之排序(希尔排序)
c语言·开发语言·数据结构·算法·排序算法
猫猫的小茶馆3 小时前
【数据结构】数据结构整体大纲
linux·数据结构·算法·ubuntu·嵌入式软件
u0107735143 小时前
【字符串】-Lc5-最长回文子串(中心扩展法)
java·算法
帅逼码农4 小时前
K-均值聚类算法
算法·均值算法·聚类
姚先生974 小时前
LeetCode 209. 长度最小的子数组 (C++实现)
c++·算法·leetcode