文章目录

  • 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)相关推荐

  1. 从零开始刷Leetcode——数组(1.26)

    文章目录 1.两数之和 26.删除排序数组中的重复项 马上要去读研了,作为一个转码的ee学生,刷题还是很必要的.从零开始,希望能坚持下去!打算按照类别和难度慢慢刷,一天两三道题左右,争取明年夏季找实习 ...

  2. 从零开始刷Leetcode——数组(11.15.16.18)

    文章目录 11. 盛最多水的容器 15. 三数之和 16. 最接近的三数之和 18. 四数之和 前800题easy难度想做的已经做完了,之后是medium难度 11. 盛最多水的容器 给你 n 个非负 ...

  3. 从零开始刷Leetcode——数组(122.167.169)

    文章目录 122.买卖股票的最佳时机 II 167.两数之和II 169.多数元素 122.买卖股票的最佳时机 II 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计 ...

  4. 从零开始刷Leetcode——数组(941.977)

    文章目录 941. 有效的山脉数组 977. 有序数组的平方 三级目录 941. 有效的山脉数组 给定一个整数数组 A,如果它是有效的山脉数组就返回 true,否则返回 false. 让我们回顾一下, ...

  5. 从零开始刷Leetcode——数组(896.905.914.922)

    文章目录 896. 单调数列 905. 按奇偶排序数组 914. 卡牌分组 922. 按奇偶排序数组 II 896. 单调数列 如果数组是单调递增或单调递减的,那么它是单调的. 如果对于所有 i &l ...

  6. 从零开始刷Leetcode——数组(830.849.888)

    文章目录 830. 较大分组的位置 849. 到最近的人的最大距离 888. 公平的糖果交换 830. 较大分组的位置 在一个由小写字母构成的字符串 S 中,包含由一些连续的相同字符所构成的分组. 例 ...

  7. 从零开始刷Leetcode——数组(746.747)

    文章目录 747. 至少是其他数字两倍的最大数 746. 使用最小花费爬楼梯 747. 至少是其他数字两倍的最大数 在一个给定的数组nums中,总是存在一个最大元素 . 查找数组中的最大元素是否至少是 ...

  8. 从零开始刷Leetcode——数组(31.33)

    文章目录 31. 下一个排列 33. 搜索旋转排序数组 31. 下一个排列 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重 ...

  9. 从零开始刷Leetcode——数组(697.717.724)

    文章目录 697. 数组的度 717. 1比特与2比特字符 724. 寻找数组的中心索引 697. 数组的度 给定一个非空且只包含非负数的整数数组 nums, 数组的度的定义是指数组里任一元素出现频数 ...

最新文章

  1. 女程序员做编程也太难了吧! | 每日趣闻
  2. 2021年下半年软考报考流程!
  3. MySQL条件查询介绍
  4. PID控制器开发笔记之二:积分分离PID控制器的实现
  5. Supervisor管理springboot应用进程
  6. java xml 单标签,如何修改java中的xml标签特定值?
  7. Idea下载汉语语言包(IntelliJ IDEA 2021.2.1)​​
  8. 网络工程师工作经验分享
  9. HDU - 3237 Help Bubu (好题)
  10. Windows云服务器上部署ASP.NET网站详解(新手适用)
  11. 使用nginx负载均衡器提高并发量
  12. Android微博平台设计,基于Android平台的微博系统设计与开发
  13. 【上电即上华为云】华为云smart智联PLC无线网关_plc_3121N-H(3121N-IED)
  14. 全国2013年10月考试《行政组织理论》试题和答案
  15. vue通用后台管理(登录页面)
  16. # 华为mate40 or iphon 12
  17. [bzoj5507] [洛谷P5305] [gzoi2019]旧词
  18. 马云退休后首次演讲!听众是全球1500名校长
  19. docker下redis清理缓存
  20. java 游戏 弓箭手 法师 战士_酷酷爱魔兽战士弓箭手法师阵容搭配及职业特点介绍...

热门文章

  1. 使用for循环遍历文件、使用while循环遍历文件
  2. windows10环境下node js版本快速升级
  3. C#使用StreamWriter类写入文件文件
  4. 流程控制语句【循环、条件】
  5. 新浪微博API使用方法
  6. ICMP报文类型和代码
  7. java获取access token_微信java 开发4 access_token获取
  8. python matplot绘图legend_Python matplotlib绘图基本元素
  9. 软件测试人员进阶必读的八大书籍
  10. 本地修改服务器上的内容,本地修改指向服务器