文章目录

  • 1. 求众数(169)
  • 2. 旋转数组(189)
  • 3. 存在重复元素(217)
  • 4. 存在重复元素II(219)
  • 5. 缺失数字(268)
  • 6. 移动零(268)
  • 7. 第三大的数(414)
  • 8. 找到所有数组中消失的数字(448)
  • 9. 最大连续1的个数(485)
  • 10. 数组中的K-diff数对(532)
  • 11. 数组拆分(561)
  • 12. 重塑矩阵(566)
  • 12. 最短无序连续子数组(581)

1. 求众数(169)

给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在众数。

示例 1:

输入: [3,2,3]
输出: 3
示例 2:

输入: [2,2,1,1,1,2,2]
输出: 2

解法1
注意最多的元素出现的次数大于数组长度的一半,所以使用如下的代码,在最极端的情况下,最后的count都会大于0,cand就是所要找的元素

class Solution(object):def majorityElement(self, nums):""":type nums: List[int]:rtype: int"""cand = nums[0]count = 1for i in nums[1:]:if count == 0:cand, count = i, 1else:if i == cand:count = count + 1else:count = count - 1return cand

解法2:用sort方法

class Solution:def majorityElement(self, nums: List[int]) -> int:return sorted(nums)[len(nums)//2]

2. 旋转数组(189)

给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。

示例 1:

输入: [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:

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

解法

class Solution:def rotate(self, nums: List[int], k: int) -> None:"""Do not return anything, modify nums in-place instead."""n = len(nums)nums[:] = nums[n - k:] + nums[:n - k]

3. 存在重复元素(217)

给定一个整数数组,判断是否存在重复元素。

如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。

示例 1:

输入: [1,2,3,1]
输出: true
示例 2:

输入: [1,2,3,4]
输出: false
示例 3:

输入: [1,1,1,3,3,4,3,2,4,2]
输出: true

解法:利用set不能保存重复元素的特性,判断前后两个数组长度是否相同即可。

class Solution:def containsDuplicate(self, nums: List[int]) -> bool:list_len = len(nums)set_len = len(set(nums))if list_len == set_len:return Falseelse:return True

4. 存在重复元素II(219)

给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 k。

示例 1:

输入: nums = [1,2,3,1], k = 3
输出: true
示例 2:

输入: nums = [1,0,1,1], k = 1
输出: true
示例 3:

输入: nums = [1,2,3,1,2,3], k = 2
输出: false

解法:用dict保存数组元素出现的位置,两种情况下更新

class Solution:def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:dic = dict()for index,value in enumerate(nums):if value in dic and index - dic[value] <= k:return Truedic[value] = indexreturn False

5. 缺失数字(268)

给定一个包含 0, 1, 2, …, n 中 n 个数的序列,找出 0 … n 中没有出现在序列中的那个数。

示例 1:

输入: [3,0,1]
输出: 2
示例 2:

输入: [9,6,4,2,3,5,7,0,1]
输出: 8
解法

class Solution:def missingNumber(self, nums: List[int]) -> int:n = len(nums)return n * (n+1) //2 - sum(nums)

6. 移动零(268)

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

示例:

输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:

必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。

解法
遍历数组,用一个变量记录当前不为0的个数,同时也是新不为零元素插入的位置:

class Solution:def moveZeroes(self, nums: List[int]) -> None:"""Do not return anything, modify nums in-place instead."""index = 0for num in nums:if num != 0:nums[index] = numindex += 1for i in range(index, len(nums)):nums[i] = 0

7. 第三大的数(414)

给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是O(n)。

示例 1:

输入: [3, 2, 1]

输出: 1

解释: 第三大的数是 1.
示例 2:

输入: [1, 2]

输出: 2

解释: 第三大的数不存在, 所以返回最大的数 2 .
示例 3:

输入: [2, 2, 3, 1]

输出: 1

解释: 注意,要求返回第三大的数,是指第三大且唯一出现的数。
存在两个值为2的数,它们都排第二。

解法
这里用三个值记录前三大的数字,要注意是三个不同的数字,重复的数字不记录排序,所以要注意判断条件:

class Solution:def thirdMax(self, nums: List[int]) -> int:max1 = max2 = max3 = float('-inf')for num in nums:if num > max1:max2, max3 = max1, max2max1 = numelif num < max1 and num > max2:max2, max3 = num, max2elif num < max2 and num > max3:max3 = numreturn max1 if max3 == float('-inf') else max3

8. 找到所有数组中消失的数字(448)

给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。

找到所有在 [1, n] 范围之间没有出现在数组中的数字。

您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内。

示例:

输入:
[4,3,2,7,8,2,3,1]

输出:
[5,6]
解法
这个题就比较神奇了,注意到数组元素个数跟元素范围是一样的,所以我们可以把出现过的元素对应下标位置的数字变成负数,最后把所有正数对应的下标拿出来,就是缺失的数字。

class Solution:def findDisappearedNumbers(self, nums: List[int]) -> List[int]:for i in range(len(nums)):index = abs(nums[i])-1nums[index] = -abs(nums[index])return [i+1 for i in range(len(nums)) if nums[i] > 0]

9. 最大连续1的个数(485)

给定一个二进制数组, 计算其中最大连续1的个数。

示例 1:

输入: [1,1,0,1,1,1]
输出: 3
解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3.
注意:

输入的数组只包含 0 和1。
输入数组的长度是正整数,且不超过 10,000。

解法

class Solution:def findMaxConsecutiveOnes(self, nums: List[int]) -> int:cnt = 0res = 0for i in range(len(nums)):if nums[i] == 1:cnt += 1res = max(res, cnt)else:cnt = 0return res

10. 数组中的K-diff数对(532)

给定一个整数数组和一个整数 k, 你需要在数组里找到不同的 k-diff 数对。这里将 k-diff 数对定义为一个整数对 (i, j), 其中 i 和 j 都是数组中的数字,且两数之差的绝对值是 k.

示例 1:

输入: [3, 1, 4, 1, 5], k = 2
输出: 2
解释: 数组中有两个 2-diff 数对, (1, 3) 和 (3, 5)。
尽管数组中有两个1,但我们只应返回不同的数对的数量。
示例 2:

输入:[1, 2, 3, 4, 5], k = 1
输出: 4
解释: 数组中有四个 1-diff 数对, (1, 2), (2, 3), (3, 4) 和 (4, 5)。
示例 3:

输入: [1, 3, 1, 5, 4], k = 0
输出: 1
解释: 数组中只有一个 0-diff 数对,(1, 1)。
注意:

数对 (i, j) 和数对 (j, i) 被算作同一数对。
数组的长度不超过10,000。
所有输入的整数的范围在 [-1e7, 1e7]。

解法1
使用collections集合模块

class Solution:def findPairs(self, nums: List[int], k: int) -> int:if k>0:return len(set(nums) & set(n+k for n in nums))elif k==0:return sum(v>1 for v in collections.Counter(nums).values())else:return 0

解法2
不使用collections集合模块

class Solution:def findPairs(self, nums: List[int], k: int) -> int:count,n=0,len(nums)s=set(nums)if k<0 or len(nums)<2:return 0if k==0:for ele in s:if nums.count(ele)>1:count+=1return countfor ele in s:#保证数据的不重复,同时不选自己if ele+k in s:count+=1return count

参考:https://blog.csdn.net/qq_41929011/article/details/88532227

11. 数组拆分(561)

给定长度为 2n 的数组, 你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), …, (an, bn) ,使得从1 到 n 的 min(ai, bi) 总和最大。

示例 1:

输入: [1,4,3,2]

输出: 4
解释: n 等于 2, 最大总和为 4 = min(1, 2) + min(3, 4).
提示:

n 是正整数,范围在 [1, 10000].
数组中的元素范围在 [-10000, 10000].

解法
就是返回排序后第1,3,5,。。2n-1小的数

class Solution:def arrayPairSum(self, nums: List[int]) -> int:return sum(sorted(nums)[::2])

12. 重塑矩阵(566)

在MATLAB中,有一个非常有用的函数 reshape,它可以将一个矩阵重塑为另一个大小不同的新矩阵,但保留其原始数据。

给出一个由二维数组表示的矩阵,以及两个正整数r和c,分别表示想要的重构的矩阵的行数和列数。

重构后的矩阵需要将原始矩阵的所有元素以相同的行遍历顺序填充。

如果具有给定参数的reshape操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。

示例 1:

输入:
nums =
[[1,2],
[3,4]]
r = 1, c = 4
输出:
[[1,2,3,4]]
解释:
行遍历nums的结果是 [1,2,3,4]。新的矩阵是 1 * 4 矩阵, 用之前的元素值一行一行填充新矩阵。
示例 2:

输入:
nums =
[[1,2],
[3,4]]
r = 2, c = 4
输出:
[[1,2],
[3,4]]
解释:
没有办法将 2 * 2 矩阵转化为 2 * 4 矩阵。 所以输出原矩阵。
注意:

给定矩阵的宽和高范围在 [1, 100]。
给定的 r 和 c 都是正数。

解法
将数组转换为1行,然后根据要转换的行列数进行转换

class Solution:def matrixReshape(self, nums: List[List[int]], r: int, c: int) -> List[List[int]]:if len(nums) * len(nums[0]) != r * c:return numselse:onerow = [nums[i][j] for i in range(len(nums)) for j in range(len(nums[0]))]return [onerow[t * c : (t+1) * c] for t in range(r)]

12. 最短无序连续子数组(581)

给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。

你找到的子数组应是最短的,请输出它的长度。

示例 1:

输入: [2, 6, 4, 8, 10, 9, 15]
输出: 5
解释: 你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。
说明 :

输入的数组长度范围在 [1, 10,000]。
输入的数组可能包含重复元素 ,所以升序的意思是<=。

解法
all_same[::-1]返回的不是从正向数的索引,返回的是以最后一个元素为0索引,倒数第二个元素为1索引的反向数列的索引值,如例子中所示,从前数有一个不需排序,从后数,有一个不需排序。

class Solution:def findUnsortedSubarray(self, nums: List[int]) -> int:all_same = [a == b for (a, b) in zip(nums, sorted(nums))]return 0 if all(all_same) else len(nums) - all_same.index(False) - all_same[::-1].index(False)

LeetCode—Python版数组简单题(二)相关推荐

  1. LeetCode Python实现 二叉树简单部分

    LeetCode Python实现 二叉树简单部分 ''' 1 二叉树的最大深度 给定一个二叉树,找出其最大深度.二叉树的深度为根节点到最远叶子节点的最长路径上的节点数.说明: 叶子节点是指没有子节点 ...

  2. leetcode 中的链表简单题 python3

    目录: 基本使用 // 21题 合并有序链表 // 83题 删除有序链表重复元素 // 141题 环形链表 // 160题 相交链表 // 203题 移除链表元素// 206题 反转链表 // 基本使 ...

  3. python之simplejson,Python版的简单、 快速、 可扩展 JSON 编码器/解码器

    simplejson Python版的简单. 快速. 可扩展 JSON 编码器/解码器 编码基本的 Python 对象层次结构: import simplejson as jsonprint json ...

  4. LeetCode Python实现 链表简单部分

    LeetCode Python实现 链表简单部分 我以前完全没有写过关于链表的东西,node.val=node.next.val#当前值被后一个值覆盖node.next=node.next.next# ...

  5. 如何用Python制作一个简单的二维码生成器

    目录 前言 1.安装第三方库 2.QRCode参数解释 3.自定义二维码生成器 4.给二维码加图片 5.全部代码 6.结果 前言 二维码又称二维条码,常见的二维码为QR Code,QR全称Quick ...

  6. 大恒相机Python版Qt界面(二)

    书接上回:大恒相机Python版Qt界面(一)_△ф的博客-CSDN博客_python大恒.目前,基于PyQt5的大恒相机UI界面开发已基本完成,总体界面如下: 该UI界面中,主要包括了相机使用中的几 ...

  7. Python版冈萨雷斯 V1.0 (二)

    Python版冈萨雷斯 V1.0 第三章 亮度变换和空间滤波 系列 [第二章 基本原理] 使用OpenCV 库,OpenCV 是计算机视觉中经典的专用库,其支持多语言.跨平台,功能强大. 3.2亮度变 ...

  8. Python 三维数组转化为二维数组 和MATLAB的reshape函数结果一致

    最近在把Matlab的toolbox转到Python语言,涉及到了很多矩阵运算,经常会用到Matlab中的reshape函数,但是Python和它reshape的结果总不一致,导致我最后Python画 ...

  9. 数据结构-字符串和数组简单题

    大数加法 以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回. 数据范围:len(s),len(t) \le 100000len(s),len(t)≤100000,字符串仅由'0' ...

  10. 林子雨-Spark入门教程(Python版)-学习笔记(二)

    第3章 Spark编程基础 从文件加载数据 从文件系统中加载数据创建RDD--textFile()方法,该方法把文件的URI作为参数 注意: (1)本地文件系统的路径,必须要保证在所有的worker节 ...

最新文章

  1. 在线录音机 html5,recorder
  2. AES算法重点详解和实现
  3. NET Framework 安装时出现错误无法安装
  4. 9-5:C++多态之多态和继承的经典题目以及面试中常考内容
  5. 可视化学习笔记 - ECharts
  6. 【Java从0到架构师】MyBatis - dao
  7. 在计算机网络GAN代表什么,图解 生成对抗网络GAN 原理 超详解
  8. mysql怎么下载_mysql下载安装使用教程
  9. 编译问题:App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecur
  10. 扫读笔好还是点读笔好 有什么区别
  11. SD-WAN 系列--企业专线、企业互联网
  12. linux 查看磁盘实际空间,如何运用linux查看磁盘总空间
  13. jsp+ssm计算机毕业设计学校缴费系统【附源码】
  14. 2012年那些大败局
  15. KDD2019 | 开放学术图谱 (OAG): 大规模知识图谱异构实体对齐
  16. 游戏开发中的专业术语
  17. 安卓桌面壁纸_梅糖桌面安卓手机版下载-梅糖桌面app官方版下载v2.2安卓版
  18. 读完《筚路蓝缕——世纪工程决策建设记述》
  19. 16 张图带你搞懂 Java 数据结构,从此想不飘都难!
  20. 物联卡官方充值渠道在哪里?物联网卡管理平台有什么作用?

热门文章

  1. Flex事件机制(三)
  2. 导出所有DB2存储过程的四种方法
  3. 【JOURNAL】Greeting via Connexion on Air in Lufthansa并一些祝福
  4. 第四十四篇 面向对象高阶
  5. ArrayList和CopyOnWriteArrayList
  6. Java 输入输出流 转载
  7. Python实现常见算法[1]——冒泡排序
  8. 去除TCP/IP筛选
  9. 一天一个小技巧(1)——CSDN编辑器中文字颜色、尺寸、类型修改
  10. mysql行级锁 select for update