文章目录

  • 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. Android获取当前时间
  2. Leangoo敏捷项目管理软件 6.3.2
  3. 微软系统遭*** 谴责人为失误
  4. python web框架互相融合, Pyramid或取代Django
  5. 在阿里云上以Daemon进程方式运行SAP Cloud Connector portable版本的尝试
  6. Python基础44(PyMySQL模块)
  7. WebService的基本概念:java webservice,什么是webservice
  8. Python matplotlib 线图(plt.plot())
  9. poj3349找相同的雪花(哈希)
  10. python︱写markdown一样写网页,代码快速生成web工具:streamlit 展示组件(三)
  11. installshield中用release wizard打包.net framework 1.1中文版
  12. 以下不是python内置函数的是_Python内置函数
  13. LINUX获取当前窗口的ID
  14. 全国所有火车站站点信息
  15. 国家级赛事正式开赛 | 2019数字中国创新大赛上线
  16. 深入理解Camera 基础知识点
  17. 央行上海总部推出企业信用报告网银查询渠道
  18. PageRank算法与特征向量和特征值(eigenvector和eigenvalue)
  19. 【转载】网站关闭了域名备案信息是否需要注销,答案是一定要记得注销域名备案信息
  20. C/C++项目源码——五子棋

热门文章

  1. 《5》CentOS7.0+OpenStack+kvm云平台部署—配置Horizon
  2. oracle导入导出表
  3. 关闭Visual Studio 实时调试器
  4. Qt-做一个快速打包插件(一键完成项目软件打包)
  5. 串灯控制盒去掉怎么接_仿木地板瓷砖怎么样?仿木地板瓷砖怎么铺?
  6. php 批量修改表格数据,PHP批量修改数据库表前缀教程+代码
  7. 性能测试——loadrunner_添加多个主机发送请求
  8. android 标题栏进度圈使用方法,Android 标题栏显示进度条
  9. Python闭包基本介绍与作用
  10. 剑指offer面试题[24]-二插搜索树的后序遍历序列