LeetCode热题100—普通数组

53.最大子数组和

题目

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组

是数组中的一个连续部分。

示例 1:

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

示例 2:

输入:nums = [1]
输出:1

示例 3:

输入:nums = [5,4,-1,7,8]
输出:23

思路

一看就感觉要用动态规划,设dp[i]为前i个字符串中连续子数组的最大和,那么 dp[i] = max(dp[i-1]+nums[i],nums[i]) 即在原来的基础上选用这个num[i]或者直接用num[i]

不过最大值不一定是最后的dp[-1],故需要一个res用来保存中间出现过的最大值

代码如下:

class Solution {
public:int maxSubArray(vector<int>& nums) {vector<int> dp(nums.size(),0);dp[0] = nums[0];int ans = nums[0];for(int i = 1;i<nums.size();i++){dp[i] = max(dp[i-1]+nums[i],nums[i]);ans = max(ans,dp[i]);}return ans;}};

不过其实优化一下使用前缀和也可以:

class Solution(object):def maxSubArray(self, nums):""":type nums: List[int]:rtype: int"""sum = 0res = nums[0] for num in nums:sum += numif sum <= num:sum = numres = max(res,sum)return res

56.合并区间

题目

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间

示例 1:

输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例 2:

输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。

思路

第一想法肯定要按照左区间排序,然后不断进行合并merge,第二部没有想的特别清楚导致出错。。。后面看了题解后发现可以用一个下标进行答案数组的遍历来进行更新,代码如下:

class MyCompare{
public:bool operator()(vector<int> T1,vector<int> T2){return T1[0] < T2[0]; }
};
​
class Solution {
public:vector<vector<int>> merge(vector<vector<int>>& intervals) {sort(intervals.begin(),intervals.end(),MyCompare());vector<vector<int>> ans;int idx = -1;for(auto& nums:intervals){if(idx != -1 && nums[0] <= ans[idx][1]){ans[idx][1] = max(ans[idx][1],nums[1]);  //使用答案数组进行遍历更新}else{ans.push_back(nums);idx++;}}return ans;}
};

189.轮转数组

题目

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

示例 1:

输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右轮转 1 步: [7,1,2,3,4,5,6]
向右轮转 2 步: [6,7,1,2,3,4,5]
向右轮转 3 步: [5,6,7,1,2,3,4]

示例 2:

输入:nums = [-1,-100,3,99], k = 2
输出:[3,99,-1,-100]
解释: 
向右轮转 1 步: [99,-1,-100,3]
向右轮转 2 步: [3,99,-1,-100]

思路

首先想到k要取个模然后就有点卡壳,后面感觉这种轮转的能够跟旋转搭上关系,如果先旋转一次后再对k取模的前一块和后一块进行旋转便是答案,代码如下:

class Solution {
public:void Reverse(vector<int>& nums,int start,int end){while(start < end){swap(nums[start],nums[end]);start++;end--;            }}void rotate(vector<int>& nums, int k) {k = k % nums.size();Reverse(nums,0,nums.size()-1);Reverse(nums,0,k-1);Reverse(nums,k,nums.size()-1);}
};

238.除自身以外数组的乘积

题目

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积

题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。

不要使用除法,且在 O(*n*) 时间复杂度内完成此题。

示例 1:

输入: nums = [1,2,3,4]
输出: [24,12,8,6]

示例 2:

输入: nums = [-1,1,0,-3,3]
输出: [0,0,9,0,0]

思路

限制使用除法,那么就只能靠乘积,而乘积的话必须要把自己扔掉,发现可以错位相乘得出答案

例如示例1,2,3,4,第一遍可以将其变成1,1,2,6,然后反向遍历乘法的时候24,12,4,1

再比如2,3,4,5,第一遍可以变成1,2,6,24,然后反向的时候变成60,20,5,1

同样得到答案,即两遍遍历即可,代码如下:

class Solution {
public:vector<int> productExceptSelf(vector<int>& nums) {vector<int> result(nums.size(),1);int k = 1;for(int i = 0;i < nums.size();i++){result[i] = k;k *= nums[i];}k = 1;for(int i = nums.size()-1;i >= 0;i--){result[i] *= k;k *= nums[i];}return result;}
};

41.缺失的第一个正数

题目

给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。

请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。

示例 1:

输入:nums = [1,2,0]
输出:3
解释:范围 [1,2] 中的数字都在数组中。

示例 2:

输入:nums = [3,4,-1,1]
输出:2
解释:1 在数组中,但 2 没有。

示例 3:

输入:nums = [7,8,9,11,12]
输出:1
解释:最小的正数 1 没有出现。

思路

感觉要用哈希,,,并且也实现了一下,不过空间复杂度不符合要求,后面感觉只能对原数组进行修改,

由鸽巢原理数组长度为len,除非数组中正好有1-len的时候答案为len+1,否则答案一定在1-len中可以找到

1.首先先把负数和0剔除掉,将其改为len+1

2.然后原地哈希,对于在1-len之间的数字k,其对应下标k-1的数字num[k-1]变为-abs(num[k-1]),利用负号将这个数出现过的信息存下

3.第三遍便利的时候只需要找到正数然后返回下标+1即可,如果遍历也找不到正数,那么就返回len+1

代码如下:

class Solution(object):def firstMissingPositive(self, nums):l = len(nums)for i in range(l):if nums[i] <= 0:nums[i] = l+1for i in range(l):num = abs(nums[i])if num <= l:nums[num-1] = -abs(nums[num-1])for i in range(l):if nums[i] > 0:return i+1return l+1

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

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

相关文章

【Linux】进程信号及相关函数/系统调用的简单认识与使用

文章目录 前言一、相关函数/系统调用1. signal2. kill3. abort (库函数)4. raise (库函数)5. alarm 前言 现实生活中, 存在着诸多信号, 比如红绿灯, 上下课铃声…我们在接收到信号时, 就会做出相应的动作. 对于进程也是如此的, 进程也会收到来自 OS 发出的信号, 根据信号的不同…

【ARM 嵌入式 C 入门及渐进 6.1 -- ARMv8 C 内嵌汇编写系统寄存器的函数实现】

请阅读【嵌入式开发学习必备专栏】 文章目录 ARMv8 C 内嵌汇编写系统寄存器 ARMv8 C 内嵌汇编写系统寄存器 在ARMv8架构下&#xff0c;使用C语言结合内嵌汇编实现将一个值写入特定系统寄存器的函数可以按照下面的方法进行。 下面这个示例展示了如何将一个uint64_t类型的值写入…

[OpenGL] 法线贴图

目录 一 为什么要使用法线贴图 二 二种不同法线方式的使用 2.1 插值法线 2.1 法线贴图 本章节源码 点击此处 一 为什么要使用法线贴图 法线贴图我们可以使用更少的顶点表现出同样丰富的细节。高精度网格和使用法线贴图的低精度网格几乎区分不出来。所以法线贴图不仅看起来…

UE5中搭建一个简单的海岛

本文将用UE的WaterSystem与地形搭建一个简单的海岛&#xff0c;通过WaterSystem的参数设置&#xff0c;可以更好的自定义海岸线等效果。 1.基础风貌 1.1.首先新建一个Basic基础场景&#xff0c;切换到地形编辑模式刷出一块高地&#xff0c;用于沙滩。 1.2.引入UE官方插件Wat…

[IMX6ULL驱动开发]-Linux对中断的处理(一)

目录 中断概念的引入 ARM架构中断的流程 异常向量表 Linux系统对中断的处理 ARM对程序和中断的处理 Linux进程中断处理 中断概念的引入 如何理解中断&#xff0c;我们可以进行如下抽象。把CPU看做一个母亲&#xff0c;当它正在执行任务的时候&#xff0c;可以看为是一个母…

【BSP开发经验】简易文件系统digicapfs实现方式

文章目录 背景Linux vfs框架介绍数据结构系统调用openwriteread 总体框架 Linux 磁盘高速缓存机制标准文件访问同步文件访问异步文件访问buffer_head 如何实现一个简单的文件系统blkdevfs注册文件系统产生一个文件让文件变得可读可写 背景 在新的分区升级启动方案中需要分别实…

OGG几何内核-BRepBuilderAPI_MakeEdge学习

OGG几何内核fork自OCCT 7.7.0&#xff0c; BRepBuilderAPI_MakeEdge是几何内核的一个重要和基础的功能&#xff0c;也十分复杂&#xff0c;因为要支持line、circle、ellipse&#xff0c;parabola&#xff0c;hyperbola&#xff0c;circle&#xff0c;beziercurve&#xff0c;b…

springboot常用的注解

启动注解(Spring Boot 应用的入口注解)@SpringBootApplication @SpringBootApplication 是一个注解,它是 Spring Boot 应用的入口注解,用于表示一个应用程序的主类。这个注解通常被放置在包含 main() 方法的类上。@SpringBootApplication 是一个组合注解,整合了以下三个注…

亚马逊测评还能做吗?

只能说测评不是唯一的手段&#xff0c;但是推销量的一把好手。首先测评能让listing快速成长&#xff0c;短期内有望成为爆款&#xff0c;速度快&#xff0c;利润高&#xff0c;回款快。相对其他推广&#xff0c;测评无疑是有效&#xff0c;省培养listing的方法。其次新品前期太…

设计模式六大原则

开闭原则&#xff1a;对修改封闭&#xff0c;对拓展开放。 单一职责原则&#xff1a;类的功能要专一。 里氏代换原则&#xff1a;子类继承父类的时候&#xff0c;除添加新的方法完成新增功能外&#xff0c;尽量不要重写父类方法。 依赖倒转原则&#xff1a;类要依赖接口&…

Hsql每日一题 | day01

前言 就一直向前走吧&#xff0c;沿途的花终将绽放~ 题目&#xff1a;找出连续活跃3天及以上的用户 create table t_useractive(uid string,dt string );insert into t_useractive values(A,2023-10-01),(A,2023-10-02),(A,2023-10-03),(A,2023-10-04),(B,2023-10-01),(B…

代码随想录打卡第38天:动态规划解决编辑距离和回文串

1.72编辑距离 1.问题描述 找到其中需要进行操作的最少次数。 2.问题转换 大体思路可以参照前面的两个字符串的删除操作。添加操作可以将其看做是一个另类的删除操作&#xff0c;所以最后全部都可以看做是一个删除操作 3.解题思路 每一个位置的word1[i]和word2[j]都有两种…

RTOS原理和应用总结

RTOS的作用 RTOS一般应用在中低端处理器当中&#xff0c;这里举一个笔者日常开发遇到的案例来说明RTOS的作用。 假设你有一个设备&#xff0c;这个设备的外围硬件很多&#xff0c;假设有LED、一个网口、若干RS232等等。 在没有RTOS的时候&#xff0c;我们用裸机编程来写&…

HTML5 多媒体应用技术

目录 多媒体元素 audio元素video元素多媒体事件与JavaScript交互音频和视频轨道(Track)媒体API MediaElement APIMediaSource Extensions (MSE)Encrypted Media Extensions (EME)Web Audio API

数据库同步软件,天不生PanguSync万古如长夜

在信息时代的海洋中&#xff0c;数据是那永不熄灭的灯塔&#xff0c;照亮了科技发展的航道。然而&#xff0c;随着数据的膨胀和应用场景的多样化&#xff0c;如何确保这些宝贵资源在不同平台、不同设备间实时更新、保持一致性&#xff0c;便成了一道亟待解决的难题。于是&#…

Android File Transfer for mac(强大的安卓文件传输工具) 直装版

Android File Transfer是一款专门为Mac用户设计的软件&#xff0c;它用于在Android设备与Mac之间传输文件。这款软件提供了简单直观的操作界面&#xff0c;使用户能够轻松地在Android设备和Mac之间传输和管理文件。 下载地址&#xff1a;https://www.macz.com/mac/7099.html?i…

使用python实现socket进行消息传输-demo

Socket 是什么 Socket 是一种在计算机网络中用于实现进程间通信的一种机制。它是网络编程中的重要概念&#xff0c;通过它可以在不同的计算机之间进行数据传输和通信。Socket 可以用于实现各种网络应用&#xff0c;包括客户端-服务器模型、P2P 应用等。基本上&#xff0c;Sock…

自动驾驶决策规划算法——二次规划

自动驾驶决策规划算法第二章第二节(中) 参考线算法_哔哩哔哩_bilibili 动态规划开辟的凸空间如下&#xff0c;两条橙色线之间&#xff1a; 黄色的点就意味着L的上下界&#xff0c;物理意义是当轨迹ss1时&#xff0c;L的范围应该是(Lmin1,Lmax1)之间&#xff0c;这个范围就是开辟…

学习日记.1

今天就是配置了droidbot的环境。主要的知识来源是GitHub - xieincz/droidbot: A lightweight test input generator for Android. Similar to Monkey, but with more intelligence and cool features! 看readme&#xff0c;注意只需要platform就好&#xff0c;sdk太大不用下载…

《Ai企业知识库》-模型实践-rasa开源学习框架-基础理论-02

rasa官网 Conversational AI Platform | Superior Customer Experiences Start Here rasa简介&#xff1a; Rasa是一个开源的机器学习框架&#xff0c;专门用于构建自动化的文本和语音对话系统&#xff0c;即聊天机器人。它允许开发者和企业创建定制化的对话体验&#xff0c…