leetcode_414. Third Maximum Number 返回数组中第三大的数,要求用O(n)的时间复杂度
2016-11-06 20:37
253 查看
题目:
Given a non-empty array of integers, return the third maximum number in this array. If it does not exist, return the maximum number. The time complexity must be in O(n).
Example 1:
Example 2:
Example 3:
题意:
给定一个非空整数数组,返回这个数组第三大的数,如果第三大的数不存在,则返回最大的数。要求用O(n)的时间复杂度。相同的数,表示一样大。
代码:
class Solution(object):
def thirdMax(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
n = len(nums)
max_num = nums[0] #记录最大的数,初始化为nums[0]
count = 1 #记录最大的数的个数,用于寻找前三个最大的数
indx = 1 #从下标1开始遍历
while indx < n and count < 2 : #寻找第二大的数mid_num
if nums[indx] > max_num :
mid_num = max_num
max_num = nums[indx]
count += 1
else :
if nums[indx] < max_num :
mid_num = nums[indx]
count += 1
indx += 1
while indx < n and count < 3 : #继续寻找第三大的数min_num。当count=3时,表示前三个最大的数都找到,退出循环,开始遍历数组其他元素
if nums[indx] > max_num :
min_num = mid_num
mid_num = max_num
max_num = nums[indx]
count += 1
else :
if nums[indx] < max_num and nums[indx] > mid_num :
min_num = mid_num
mid_num = nums[indx]
count += 1
else :
if nums[indx] < mid_num :
min_num = nums[indx]
count += 1
indx += 1
for i in range(indx,n) : #开始遍历数组其他元素。之前在这个地方犯过错,让i从indx+1开始遍历,其实是不对的。因为上面while跳出循环时,如果是indx>=n,则此处也不用遍历了,所以一定是count=3条件才会执行此处代码,此时,i = indx 的元素还没比较,故应该从indx开始遍历
if nums[i] > max_num :
min_num = mid_num
mid_num = max_num
max_num = nums[i]
else :
if nums[i] < max_num and nums[i] > mid_num :
min_num = mid_num
mid_num = nums[i]
else :
if nums[i] < mid_num and nums[i] > min_num :
min_num = nums[i]
if count < 3 : #当count小于3,表示没有第三大的元素
return max_num
else :
return min_num
笔记:
这个题关键在初始化max_num,mid_num,min_num,代码用count变量(记录找到最大数的个数)来进行控制,依次定义mid_num和min_num。
表示效率还可以吧:
Given a non-empty array of integers, return the third maximum number in this array. If it does not exist, return the maximum number. The time complexity must be in O(n).
Example 1:
Input: [3, 2, 1] Output: 1 Explanation: The third maximum is 1.
Example 2:
Input: [1, 2] Output: 2 Explanation: The third maximum does not exist, so the maximum (2) is returned instead.
Example 3:
Input: [2, 2, 3, 1] Output: 1 Explanation: Note that the third maximum here means the third maximum distinct number. Both numbers with value 2 are both considered as second maximum.
题意:
给定一个非空整数数组,返回这个数组第三大的数,如果第三大的数不存在,则返回最大的数。要求用O(n)的时间复杂度。相同的数,表示一样大。
代码:
class Solution(object):
def thirdMax(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
n = len(nums)
max_num = nums[0] #记录最大的数,初始化为nums[0]
count = 1 #记录最大的数的个数,用于寻找前三个最大的数
indx = 1 #从下标1开始遍历
while indx < n and count < 2 : #寻找第二大的数mid_num
if nums[indx] > max_num :
mid_num = max_num
max_num = nums[indx]
count += 1
else :
if nums[indx] < max_num :
mid_num = nums[indx]
count += 1
indx += 1
while indx < n and count < 3 : #继续寻找第三大的数min_num。当count=3时,表示前三个最大的数都找到,退出循环,开始遍历数组其他元素
if nums[indx] > max_num :
min_num = mid_num
mid_num = max_num
max_num = nums[indx]
count += 1
else :
if nums[indx] < max_num and nums[indx] > mid_num :
min_num = mid_num
mid_num = nums[indx]
count += 1
else :
if nums[indx] < mid_num :
min_num = nums[indx]
count += 1
indx += 1
for i in range(indx,n) : #开始遍历数组其他元素。之前在这个地方犯过错,让i从indx+1开始遍历,其实是不对的。因为上面while跳出循环时,如果是indx>=n,则此处也不用遍历了,所以一定是count=3条件才会执行此处代码,此时,i = indx 的元素还没比较,故应该从indx开始遍历
if nums[i] > max_num :
min_num = mid_num
mid_num = max_num
max_num = nums[i]
else :
if nums[i] < max_num and nums[i] > mid_num :
min_num = mid_num
mid_num = nums[i]
else :
if nums[i] < mid_num and nums[i] > min_num :
min_num = nums[i]
if count < 3 : #当count小于3,表示没有第三大的元素
return max_num
else :
return min_num
笔记:
这个题关键在初始化max_num,mid_num,min_num,代码用count变量(记录找到最大数的个数)来进行控制,依次定义mid_num和min_num。
表示效率还可以吧:
相关文章推荐
- 【练习】输入一个已经按升序排序过的数组和一个数字sum,在数组中查找两个数,使得它们 的和正好是输入的那个数字sum,要求时间复杂度为O(n)
- 有1,2,....一直到n的无序数组,求排序算法,要求时间复杂度为O(n),空间复杂度O(1)
- 一个整型数组里除了一个数字之外,其他的数字都出现了两次。要求时间复杂度是O(n),空间复杂度是O(1),如何找出数组中只出现一次的数字
- 现有1,2……一直到n的无序数组,求排序算法,并且要求时间复杂度为O(n),空间复杂度为O(1),使用交换,而且只能交换两个数
- 找出一个数组中出现次数超过一半的那个数字,要求时间复杂度O(n)和空间复杂度为O(1)。
- 给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。 要求:空间复杂度O(1),时间复杂度为O(n)。
- 在已排序的数组中寻找和是给定值的两项,要求时间复杂度为O(n)
- 求所有子数组的和的最大值。要求时间复杂度为O(n)
- 一个整型数组里除了一个或者两个或者三个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)
- 同时找出数组的最大值和最小值,要求时间复杂度为o(n)
- 如何判断一个整数数组中是否有重复元素?要求时间复杂度O(n),空间复杂度O(1)
- N个元素的数组循环右移K位,要求时间复杂度为O(N)
- 一个整型数组里除了一个或者两个或者三个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)
- 求一个整型数组的最大和的子数列,要求时间复杂度为线性的
- 把一个含有N个元素的数组循环右移K位, 要求时间复杂度为O(N)
- 如何判断一个整数数组中是否有重复元素?要求时间复杂度O(n),空间复杂度O(1)
- 一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和,求所有子数组的和的最大值,要求时间复杂度为O(n)。
- 人人都来写算法 之 归并有序数组,(要求:利用原数组,且时间复杂度O(n)
- 动态规划求数组中和最大字串的值 以及 字符串的循环移位(要求空间复杂度O(1),时间复杂度O(n))
- 一个数组中,存在两个只出现一次的数字,其余的数字均出现两次。要求在时间复杂度o(n),空间复杂度为o(1)的情况下找出这两个数字