力扣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;
            }
        }
    }
};
相关推荐
ulias212几秒前
leetcode热题 - 7
数据结构·算法·leetcode
代码中介商1 分钟前
树与二叉树:数据结构核心解析
数据结构
吃好睡好便好2 分钟前
在Matlab中用sphere( )函数绘制球面图
开发语言·前端·javascript·学习·算法·matlab·信息可视化
图码3 分钟前
矩阵中的“对角线强迫症”:如何优雅地判断Toeplitz矩阵?
数据结构·c++·线性代数·算法·青少年编程·矩阵
lynnlovemin3 分钟前
二分查找与二分答案算法详解(基于C++实现)
c语言·开发语言·算法·二分查找·二分答案
瑞行AI6 分钟前
一套数据格式框架搞定大模型微调和对齐训练
算法·语言模型
玛卡巴卡ldf6 分钟前
【LeetCode 手撕算法】(动态规划)爬楼梯、杨辉三角、打家劫舍、完全平方数、零钱兑换、单词拆分、最长递增子序列、乘积最大子数组、分割等和子集
java·数据结构·算法·leetcode·动态规划·力扣
jake·tang8 分钟前
深度解析 VESC 参数辨识源码:电阻、电感与磁链
arm开发·c++·嵌入式硬件·算法·数学建模·傅立叶分析
图码14 分钟前
矩阵边界遍历:顺时针与图案打印的两种高效解法
数据结构·python·线性代数·算法·青少年编程·矩阵·深度优先遍历
sali-tec14 分钟前
C# 基于OpenCv的视觉工作流-章72-点-点距离
图像处理·人工智能·opencv·算法·计算机视觉