力扣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;
            }
        }
    }
};
相关推荐
程序员老舅11 小时前
啃透 I2C 驱动开发,才算入门嵌入式 Linux 内核驱动
数据结构·驱动开发·b树·内核·嵌入式·嵌入式开发·i2c
lueluelue4711 小时前
LeetCode:链表
算法·leetcode·链表
橘子汽水16814 小时前
Leetcode 23,543合并K个升序链表,二叉树的直径
算法·leetcode·链表
huameinan狮子14 小时前
Adaboost算法原理与计算实例
算法
别怪我很水14 小时前
API中提供了VelocityTracker类用于计算触摸事件MotionEvent的速度,而其内部默认使用的方法就是最小二乘法,本 ...
算法·gitee·最小二乘法
Re.不晚17 小时前
挑战做100道力扣算法- DAY1
算法·leetcode·职场和发展
蓝悦无人机18 小时前
《Planning algorithms》读书笔记——第1章 引言
算法·读书笔记·规划算法·lavalle
Sagittarius_A*18 小时前
分组密码基础(二):Feistel 结构与 DES 的设计思想
算法·信息安全·密码学·des·数论
青山木18 小时前
Hot 100 --- 搜索插入位置
java·数据结构·算法·leetcode