LeetCode hot100---数组及矩阵专题(C++语言)

news2024/10/8 11:52:07

1、最大子数组和

(1)题目描述以及输入输出

(1)题目描述:
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
(2)输入输出描述:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 

关键思路:
使用局部最优解,从第一个元素开始遍历数组,前一元素大于0,就与当前元素相加。
获取完最优解后,更新最大和

(2)代码块

class Solution {
public:
    int maxSubArray(vector<int>& nums) 
    {
        int result= nums[0];
        for(int i = 1;i<nums.size();++i)
        {
            if(nums[i-1] >0)nums[i] += nums[i-1];   // 局部最优
            if(nums[i] > result)result = nums[i];	// 更新最优结果
        }
        return result;
    }
};

2、合并区间

(1)题目描述以及输入输出

(1)题目描述:
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
(2)输入输出描述:
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]

关键思路:
区间按照起始位置进行排序,初始化区间起始与终点值。
从第二个区间进行遍历,比较上个区间终点与本区间起始值关系。更新区间起始与终点
遍历结束要手动将最后一个区间起始与终点加进结果

(2)代码块

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) 
    {
        vector<vector<int>> result;

        int start,end;
        start = intervals[0][0];
        end = intervals[0][1];				// 初始化区间
        
        for(int i = 1;i<intervals.size();++i)
        {
            if(end < intervals[i][0])		// 比较本区间end与上一区间开始值的关系
            {
                result.push_back({start,end});
                start = intervals[i][0];
                end = intervals[i][1];
            }
            else
            {
                end = max(end,intervals[i][1]);
            }
        }
        result.push_back({start,end});		// 手动将最后区间起始值与终点值加入结果
        return result;
    }
};

3、轮转数组

(1)题目描述以及输入输出

(1)题目描述:
给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
(2)输入输出描述:
输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]

关键思路:
使用三次reverse,先翻转整个数组,再翻转前k个元素,最后翻转剩余元素。

(2)代码块

class Solution {
public:
    void rotate(vector<int>& nums, int k) 
    {
        k %= nums.size();
        reverse(nums.begin(),nums.end());
        reverse(nums.begin(),nums.begin()+k);
        reverse(nums.begin()+k,nums.end());
    }
};

4、除自身以外数组的乘积

(1)题目描述以及输入输出

(1)题目描述:
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。
(2)输入输出描述:
输入: nums = [1,2,3,4]
输出: [24,12,8,6]

关键思路:
初始化前缀积以及后缀积为1。从第二个元素计算前缀积,从倒数第二个元素计算后缀积。
计算完将前缀积与后缀积相乘即可

(2)代码块

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) 
    {
        vector<int> result(nums.size(),1);

        int left,right;
        left = 1;
        right = 1;

        for(int i = 1;i<nums.size();++i)
        {
            left *= nums[i-1];  // 当前元素前缀积
            result[i] = left;	// 先保留前缀积
        }
        for(int i = nums.size()-2;i>=0;--i)
        {
            right *= nums[i+1]; // 当前元素后缀积
            result[i]*=right;	// 除此元素的乘积
        }
        return result;
    }
};

5、矩阵置0

(1)题目描述以及输入输出

(1)题目描述:
给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0(2)输入输出描述:
输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[1,0,1],[0,0,0],[1,0,1]]

关键思路:
遍历矩阵,找到为0元素位置,将元素的行首元素、列首元素置为0。,如果是第一行或者第一列作标记单独处理。
从矩阵第二行、第二列遍历数组,若行/列首元素为0,则将该行、列全变为0
处理第一行或第一列的0。

(2)代码块

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) 
    {
        int colmark = false;
        int rowmark = false;
        for(int i = 0;i<matrix.size();++i)
        {
            for(int j = 0;j<matrix[0].size();++j)
            {
                if(matrix[i][j] == 0)
                {
                    matrix[i][0] = 0;
                    matrix[0][j] = 0;           // 将‘0’所在的行/列首元素置为0
                    if(i == 0)rowmark = true;   // 单独处理第一行
                    if(j==0)colmark = true;     // 单独处理第一列
                }
            }
        }

        for(int i = 1;i<matrix.size();++i)
        {
            for(int j = 1;j<matrix[0].size();++j)
            {
                if((matrix[i][0] == 0) || (matrix[0][j] == 0))
                {
                    matrix[i][j] = 0;
                }
            }
            
       }
       for(int j=0;rowmark && j<matrix.size();++j)matrix[0][j] = 0; // 单独处理第一行
       for(int i=0;colmark && i<matrix.size();++i)matrix[i][0] = 0; // 单独处理第一列


    }
};

6、螺旋矩阵

(1)题目描述以及输入输出

(1)题目描述:
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
(2)输入输出描述:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

关键思路:
设置up down left right四个自变量,顺时针遍历,
上,up++;右,right--;下,down--;左,left++。

(2)代码块

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) 
    {
        vector<int> result;
        int up = 0,down = matrix.size()-1,left = 0,right = matrix[0].size()-1;

        while(1)
        {
            for(int i = left;i<=right;i++)result.push_back(matrix[up][i]);
            if(++up>down)break;

            for(int i = up;i<=down;i++)result.push_back(matrix[i][right]);
            if(--right<left)break;

            for(int i = right;i>=left;i--)result.push_back(matrix[down][i]);
            if(--down < up)break;

            for(int i = down;i>=up;i--)result.push_back(matrix[i][left]);
            if(++left>right)break;
        }
        

        return result;
    }
};

7、旋转图像

(1)题目描述以及输入输出

(1)题目描述:
给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
(2)输入输出描述:
输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
输出:[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]

关键思路:
现将矩阵进行转置,再进行水平翻转。

(2)代码块

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) 
    {
        for(int i = 0;i<matrix.size();i++)
        {
            for(int j = 0;j<i;j++)
            {
                swap(matrix[i][j],matrix[j][i]);					// 转置
            }
        }

        for(int i = 0;i<matrix.size();i++)
        {
            for(int j = 0;j<matrix.size()/2;j++)
            {
                swap(matrix[i][j],matrix[i][matrix.size()-j-1]);	// 水平翻转
            }
        }
    }
};

8、搜索二维矩阵||

(1)题目描述以及输入输出

(1)题目描述:
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:
每行的元素从左到右升序排列。
每列的元素从上到下升序排列。

(2)输入输出描述:
输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5
输出:true

关键思路:
遍历每行,对于每行的数组,采用二分查找的方式

(2)代码块

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) 
    {
        
        if(matrix.empty())return false;

        for(int i = 0;i<matrix.size();i++)
        {
            int left = 0,right = matrix[0].size()-1;
            
            if(target>=matrix[i][0] && target<=matrix[i][matrix[0].size()-1])
            {
                while(left<=right)
                {
                    int mid = (left+right)/2;
                    if(target>matrix[i][mid])left = mid+1;
                    else if(target<matrix[i][mid])right = mid-1;
                    else return true;
                }
            }
            
            else if(target < matrix[i][0])
                break;
        }
        return false;
    }
};

9、搜索插入位置

(1)题目描述以及输入输出

(1)题目描述:
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。

(2)输入输出描述:
输入: nums = [1,3,5,6], target = 5
输出: 2

关键思路:
二分查找,找到返回mid,找不到返回left

(2)代码块

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) 
    {
        int left = 0;
        int right = nums.size()-1;

        int mid;
        while(left<=right)
        {
            mid = (left+right)/2;
            if(nums[mid]<target)
                left = mid+1;
            else if(nums[mid]>target)
                right = mid-1; 
            else
                return mid;  
        }
        return right+1;
    }
};

10、搜索二维矩阵

(1)题目描述以及输入输出

(1)题目描述:
给你一个满足下述两条属性的 m x n 整数矩阵:
每行中的整数从左到右按非严格递增顺序排列。
每行的第一个整数大于前一行的最后一个整数。
给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false(2)输入输出描述:
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true

关键思路:
二分查找,遍历每行,每行使用二分查找

(2)代码块

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) 
    {
        int m = matrix.size();
        int n = matrix[0].size();
        int left,right,mid;
        for(int i = 0;i<m;++i)
        {
            left = 0;
            right = n-1;
            if(matrix[i][0] > target)
                return false;
            while(left<=right)
            {
                mid = (left+right)/2;
                if(matrix[i][mid] > target)right = mid-1;
                else if(matrix[i][mid] < target)left = mid+1;
                else return true;
            }
        }
        return false;
    }
};

11、在排序数组中查找元素的第一个和最后一个位置

(1)题目描述以及输入输出

(1)题目描述:
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1](2)输入输出描述:
输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]

关键思路:
逐个遍历

(2)代码块

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) 
    {
        int end = -1;
        int start = -1;
        bool start_flag = true;
        for(int i = 0;i<nums.size();++i)
        {
            if(nums[i] == target && start_flag)
            {
                start = i;
                start_flag = false;
            }
            else if(nums[i] == target && !start_flag)
            {
                end =  i;
            }
        }
        return {start,end};
    }
};

11、在排序数组中查找元素的第一个和最后一个位置

(1)题目描述以及输入输出

(1)题目描述:
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1](2)输入输出描述:
输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]

关键思路:
逐个遍历

(2)代码块

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) 
    {
        int end = -1;
        int start = -1;
        bool start_flag = true;
        for(int i = 0;i<nums.size();++i)
        {
            if(nums[i] == target && start_flag)
            {
                start = i;
                start_flag = false;
            }
            else if(nums[i] == target && !start_flag)
            {
                end =  i;
            }
        }
        return {start,end};
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2196284.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一手信息:用ai怎么做短视频赚钱。

AI制作短视频赚钱的具体数据与分析如下&#xff1a; 数据展示 ​ 更多实操教程和AI绘画工具,可以扫描下方,免费获取 \1. 收入情况&#xff1a; - 有案例显示&#xff0c;通过AI生成历史解说视频&#xff0c;半年内可以赚取64万人民币。 - 另一个案例则是通过AI生成电影解说…

鸿蒙 Next 实战: 环境搭建

前言 作为独立开发者&#xff0c;如果我们错过了传统移动 App&#xff0c;和后起小程序的红利&#xff0c;那万物互联 AI 的应用开发就得抓住了。 虽然个人上架应用平台难易都差不多&#xff0c;但是鸿蒙生态当前正需要广大开发者参与&#xff0c;一旦上架&#xff0c;相比其…

AI绘画ComfyUI 完全入门:基本功能完全掌握!

前言 大家好&#xff0c;我是每天分享AI应用的萤火君&#xff01; 在AI绘画领域&#xff0c;Stable Diffusion 因其开源特性而受到广泛的关注和支持&#xff0c;背后聚拢了一大批的应用开发者和艺术创作者&#xff0c;是AI绘画领域当之无愧的王者。 目前使用 Stable Diffusi…

外国钞票面值检测系统源码分享

外国钞票面值检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

新版AndroidStudio log使用

从Android Studio Dophin开始&#xff0c;Android Studio中的默认展示了新版的logcat。新版的logcat色彩上是更加的好看了&#xff0c;不同的tag会有不同的颜色&#xff0c;不同level等级的log默认也有不同的颜色。log过滤修改的更简洁了&#xff0c;当然使用起来也更加复杂了。…

系统开发基础错题解析一【软考】

目录 前言1.开发模型1.1快速原型模型优点1.2敏捷统一模型1.3增量模型的优缺点1.4极限编程1.5螺旋模型 2.软件开发方法3.数据流图与数据字典3.1判定表3.2数据流图绘制3.3决策树 4.概要设计和详细设计5.内聚性6.耦合性 前言 本文专门用来记录本人在做软考中有关系统开发基础的错…

基于SpringBoot+Vue的宠物店管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

0基础跟德姆(dom)一起学AI 机器学习03-线性回归

线性回归 线性回归介绍 【理解】举个栗子 假若有了身高和体重数据&#xff0c;来了播仔的身高&#xff0c;你能预测播仔体重吗? 这是一个回归问题&#xff0c;该如何求解呢? **思路**:先从已知身高X和体重Y中找规律&#xff0c;再预测 •数学问题&#xff1a;用一条线来拟…

【LeetCode】每日一题 2024_10_7 最低加油次数(堆、贪心)

前言 每天和你一起刷 LeetCode 每日一题~ 大家国庆节快乐呀~ LeetCode 启动&#xff01; 国庆最后一天&#xff0c;力扣还在加油站&#xff0c;怕不是国庆回家路上堵车了 题目&#xff1a;最低加油次数 代码与解题思路 func minRefuelStops(target int, startFuel int, st…

失业的程序员除了找工作,还有哪些赚钱的路子?零基础入门到精通,收藏这篇就够了_网络开发怎么赚钱

看到一个平台上的博主&#xff0c;目前在做独立开发者&#xff0c;开发了20多个网站&#xff0c;网站的类型主要是工具型和信息整理型&#xff0c;谷歌广告的收益一个月1万多。 目前他除了依靠谷歌广告的收入外&#xff0c;也在做自媒体&#xff0c;拓展这一块的收入&#xff…

41亿收购百年零部件巨头,「果链一哥」欲再造千亿规模新版图?

、 为了进一步拓展汽车业务版图&#xff0c;果链一哥立讯精密再次开启“买买买”模式。 日前&#xff0c;立讯精密发布公告称&#xff0c;计划以5.25亿欧元&#xff08;约41.3亿元人民币&#xff09;的价格收购Leoni AG&#xff08;以下简称“莱尼公司”&#xff09;50.1%股权…

打卡第五天 P3916 图的遍历

今天是我打卡第五天&#xff0c;做个普及/提高−题吧(#^.^#) 原题链接&#xff1a;图的遍历 - 洛谷 题目描述 给出 N 个点&#xff0c;M 条边的有向图&#xff0c;对于每个点 v&#xff0c;求 A(v)A(v) 表示从点 v 出发&#xff0c;能到达的编号最大的点。 输入格式 第 1 …

Golang反射解说

在Go语言中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时检查、修改和操作变量的类型信息。 反射主要用于处理那些在编译时无法确定类型的情况&#xff0c;比如处理接口类型的值、实现通用的函数等。 Go语言中反射的基本…

OpenAI 旧金山开发者大会发布五大创新功能 实时语音、视觉微调、模型蒸馏

在10月1日的 OpenAI 旧金山开发者大会&#xff08; DevDay&#xff09; 上 。OpenAI 公布了五项重大创新&#xff0c;其中“实时 API”&#xff08;Realtime API&#xff09;的新功能&#xff0c;使得开发者能够创建具有低延迟、AI 生成的语音响应功能的应用程序。尽管这一功能…

C++ | Leetcode C++题解之第461题汉明距离

题目&#xff1a; 题解&#xff1a; class Solution { public:int hammingDistance(int x, int y) {int s x ^ y, ret 0;while (s) {s & s - 1;ret;}return ret;} };

MySQL 篇-深入了解视图、SQL 优化(主键优化、order by 优化、group by 优化、update 优化等)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 SQL 优化 1.1 SQL 优化 - 插入数据 1.2 SQL 优化 - 主键优化 1.2.1 页分裂 1.2.2 页合并 1.2.3 主键设计原则 1.3 SQL 优化 - order by 优化 1.3.1 单字段排序 1.…

JS设计模式之职责链模式:优雅地处理请求流程

一. 前言 在前端开发中&#xff0c;我们经常会遇到需要按照一定的顺序处理一系列请求或操作的情况&#xff0c;如果将每一步处理都硬编码在一起&#xff0c;会导致代码臃肿&#xff0c;可维护性和可扩展性都会大大降低。而职责链模式恰好提供了一种优雅的解决方案。 无论你是…

Python进阶--正则表达式

目录 1. 基础匹配 2. 元字符匹配 1. 基础匹配 正则表达式&#xff0c;又称规则表达式&#xff08;Regular Expression&#xff09;&#xff0c;是使用单个字符串来描述、匹配某个句法规则的字符串&#xff0c;常被用来检索、替换那些符合某个模式&#xff08;规则&#xff…

HyperBDR云容灾“轻装上阵”,露脸魔都写字楼!

回顾今年828&#xff0c;万博智云作为铂金合作伙伴在仪式上惊艳亮相&#xff0c;同时还参与了华为云“云上大咖团”的直播分享&#xff0c;公司明星产品HyperBDR云容灾成功上线了828企业应用一站购平台。就在近日&#xff0c;后续来啦&#xff01; 一、HyperBDR云容灾楼宇广告…

特斯拉的TTPoE协议到底是啥?比TCP/IP快n倍?真的假的…

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 上午好&#xff0c;我的网工朋友 最近&#xff0c;在备受瞩目的Hot Chips大会上&#xff0c;特斯拉不仅展示了其最新的DOJO超级计算机项目&#…