从零开始刷Leetcode——数组(27.35.53)
文章目录
- 27.移除元素
- 35.搜索插入位置
- 53.最大子序和
今天是27.35.53题。27和昨天的26题思想差不多,35比较简单,53确实想了一段时间。
27.移除元素
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
1.反向遍历
class Solution:def removeElement(self, nums: List[int], val: int) -> int:length = len(nums)for i in range(length-1, -1, -1):if nums[i] == val:nums.pop(i)else:continuereturn len(nums)
和上一题思路一模一样,不祥述,48ms
2.单指针
class Solution:def removeElement(self, nums: List[int], val: int) -> int:length = len(nums)j=0for i in range(length):if nums[i] != val:nums[j]=nums[i]j = j+1nums = nums[:j]return len(nums)
60ms
3.没什么意义的解法
class Solution:def removeElement(self, nums: List[int], val: int) -> int:try:while True:nums.remove(val)except:return len(nums)
参考别人的,代码没什么太大意义,就是速度快点,36ms
35.搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
1.逐个比较
class Solution:def searchInsert(self, nums: List[int], target: int) -> int:length = len(nums)for i in range(length):if nums[i] >= target:return ireturn length
不说了,很简单,48ms
2.二分查找
class Solution:def searchInsert(self, nums: List[int], target: int) -> int:length = len(nums)l=0r=length-1while(l<=r):mid = (l+r)//2if nums[mid] == target:return midelif nums[mid] < target:l = mid+1else:r = mid -1return l
这个应该是标准解法,44ms,还能更快,不知道怎么弄了
53.最大子序和
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
1.暴力计算
class Solution:def maxSubArray(self, nums: List[int]) -> int:length = len(nums)max_ = nums[0]sum_ = nums[0]for i in range(1, length):# 当当前序列加上此时的元素的值大于当前元素的值,说明最大序列和可能出现在后续序列中,记录此时的最大值if sum_ + nums[i] > nums[i]:max_ = max(max_, sum_+nums[i])sum_ = sum_ + nums[i]#当当前和小于此时加上的元素时,当前最长序列到此为止。以该元素为起点继续找最大子序列,并记录此时的最大值 else:max_ = max(max_, nums[i])sum_ = nums[i]return max_
基本思路就是遍历一遍,用两个变量,一个记录最大的和,一个记录当前的和,52ms
2.分治算法
class Solution:def maxSubArray(self, nums: List[int]) -> int:n = len(nums)#递归终止条件if n == 1:return nums[0]else:#递归计算左半边最大子序和max_left = self.maxSubArray(nums[0:len(nums) // 2])#递归计算右半边最大子序和max_right = self.maxSubArray(nums[len(nums) // 2:len(nums)])#计算中间的最大子序和,从右到左计算左边的最大子序和,从左到右计算右边的最大子序和,再相加max_l = nums[len(nums) // 2 - 1]tmp = 0for i in range(len(nums) // 2 - 1, -1, -1):tmp += nums[i]max_l = max(tmp, max_l)max_r = nums[len(nums) // 2]tmp = 0for i in range(len(nums) // 2, len(nums)):tmp += nums[i]max_r = max(tmp, max_r)#返回三个中的最大值return max(max_right,max_left,max_l+max_r)
扒了一个大佬的代码,大概思想就是就是它的最大子序和要么在左半边,要么在右半边,要么是穿过中间,对于左右边的序列,情况也是一样,因此可以用递归处理。中间部分的则可以直接计算出来。速度虽然慢,180ms,但是思想可以借鉴一下
3.动态规划
class Solution:def maxSubArray(self, nums: List[int]) -> int:if len(nums) == 0:return 0if len(nums) == 1:return nums[0]dp = nums[:] # 初始化dp数组,dp[i]存储以nums[i]为结尾的子数组的和的最大值res = dp[0]for i in range(1, len(nums)):dp[i] = max(dp[i], dp[i] + dp[i - 1]) # 更新dp[i]res = max(res, dp[i]) # 更新全局最大值return res
动态规划不是很懂,先放在这,学完再补充。讲解原话是dp[i] 存储的不是从 0 到 i 这个范围内所得到的最大的连续子数组的和,而是以 nums[i] 为结尾的子数组所能达到的最大的和。速度也是52ms
从零开始刷Leetcode——数组(27.35.53)相关推荐
- 从零开始刷Leetcode——数组(1.26)
文章目录 1.两数之和 26.删除排序数组中的重复项 马上要去读研了,作为一个转码的ee学生,刷题还是很必要的.从零开始,希望能坚持下去!打算按照类别和难度慢慢刷,一天两三道题左右,争取明年夏季找实习 ...
- 从零开始刷Leetcode——数组(11.15.16.18)
文章目录 11. 盛最多水的容器 15. 三数之和 16. 最接近的三数之和 18. 四数之和 前800题easy难度想做的已经做完了,之后是medium难度 11. 盛最多水的容器 给你 n 个非负 ...
- 从零开始刷Leetcode——数组(122.167.169)
文章目录 122.买卖股票的最佳时机 II 167.两数之和II 169.多数元素 122.买卖股票的最佳时机 II 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计 ...
- 从零开始刷Leetcode——数组(941.977)
文章目录 941. 有效的山脉数组 977. 有序数组的平方 三级目录 941. 有效的山脉数组 给定一个整数数组 A,如果它是有效的山脉数组就返回 true,否则返回 false. 让我们回顾一下, ...
- 从零开始刷Leetcode——数组(896.905.914.922)
文章目录 896. 单调数列 905. 按奇偶排序数组 914. 卡牌分组 922. 按奇偶排序数组 II 896. 单调数列 如果数组是单调递增或单调递减的,那么它是单调的. 如果对于所有 i &l ...
- 从零开始刷Leetcode——数组(830.849.888)
文章目录 830. 较大分组的位置 849. 到最近的人的最大距离 888. 公平的糖果交换 830. 较大分组的位置 在一个由小写字母构成的字符串 S 中,包含由一些连续的相同字符所构成的分组. 例 ...
- 从零开始刷Leetcode——数组(746.747)
文章目录 747. 至少是其他数字两倍的最大数 746. 使用最小花费爬楼梯 747. 至少是其他数字两倍的最大数 在一个给定的数组nums中,总是存在一个最大元素 . 查找数组中的最大元素是否至少是 ...
- 从零开始刷Leetcode——数组(31.33)
文章目录 31. 下一个排列 33. 搜索旋转排序数组 31. 下一个排列 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重 ...
- 从零开始刷Leetcode——数组(697.717.724)
文章目录 697. 数组的度 717. 1比特与2比特字符 724. 寻找数组的中心索引 697. 数组的度 给定一个非空且只包含非负数的整数数组 nums, 数组的度的定义是指数组里任一元素出现频数 ...
最新文章
- 女程序员做编程也太难了吧! | 每日趣闻
- 2021年下半年软考报考流程!
- MySQL条件查询介绍
- PID控制器开发笔记之二:积分分离PID控制器的实现
- Supervisor管理springboot应用进程
- java xml 单标签,如何修改java中的xml标签特定值?
- Idea下载汉语语言包(IntelliJ IDEA 2021.2.1)​​
- 网络工程师工作经验分享
- HDU - 3237 Help Bubu (好题)
- Windows云服务器上部署ASP.NET网站详解(新手适用)
- 使用nginx负载均衡器提高并发量
- Android微博平台设计,基于Android平台的微博系统设计与开发
- 【上电即上华为云】华为云smart智联PLC无线网关_plc_3121N-H(3121N-IED)
- 全国2013年10月考试《行政组织理论》试题和答案
- vue通用后台管理(登录页面)
- # 华为mate40 or iphon 12
- [bzoj5507] [洛谷P5305] [gzoi2019]旧词
- 马云退休后首次演讲!听众是全球1500名校长
- docker下redis清理缓存
- java 游戏 弓箭手 法师 战士_酷酷爱魔兽战士弓箭手法师阵容搭配及职业特点介绍...