leetcode刷题之数组(二)

11.多数元素: 给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。题目链接:https://leetcode-cn.com/problems/majority-element/

解法1:1.用字典记录,重复元素出现的次数;2.取得最大的重复次数。

def majorityElement(nums):
    n = len(nums)
    temp = set(nums)
    li = []
    max_ = 0
    dic ={}
    for i in temp:
        a = nums.count(i)
        dic[a] = i
        max_ = max(max_,a)
    #print (dic)
    if max_ > n/2:
        return dic[max_]
    else:return 0

解法2:利用中位数

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

12.旋转数组: 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。说明:尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。要求使用空间复杂度为 O(1) 的 原地 算法。

解法:

class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        n = len(nums)
        k %= n
        if k == 0 :return
        else:
            for _ in range(k):#k=0不会进入循环
                nums.insert(0,nums.pop())#pop默认删除最后一位,同时返回所应的元素

13.存在重复元素:给定一个整数数组,判断是否存在重复元素。如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。题目链接:https://leetcode-cn.com/problems/contains-duplicate/
解法:

class Solution:
	def containsDuplicate(self, nums: List[int]) -> bool:
		 n1 = len(nums)        
		 n2 = len(set(nums))        
		 return n2<n1

14.存在重复元素II:给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 k。题目链接:https://leetcode-cn.com/problems/contains-duplicate-ii/

解法:利用哈希表也就是字典。参考链接:https://leetcode-cn.com/problems/contains-duplicate-ii/solution/ha-xi-biao-qiu-jie-by-jia-da-kong-rgupzbsedr/

def containsNearbyDuplicate(nums,k):
    hash_table = {}
    for i,num in enumerate(nums):
        if (hash_table.get(num) is not None) and (i - hash_table[num] <= k):
            return True
        else:
        hash_table[num] = i
    return False    

解法2:数学方法,只缺失一个数,利用前n项和,减去给出列表的总和即可。参考链接:https://leetcode-cn.com/problems/missing-number/solution/que-shi-shu-zi-by-leetcode/

def missingNumber(nums):
    nums_sum = sum(nums)
    n = len(nums)
    total_sum = n*(n+1)/2
    miss = total_sum - nums_sum
    return (int(miss))

15.移动零元素:给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。要求:(1)必须在原数组上操作,不能拷贝额外的数组。(2)尽量减少操作次数。
解法1:

def moveZeroes(nums):
    if 0 not in nums:return nums
    count = nums.count(0)
    while count:
        count -= 1
        i = nums.index(0)
        nums.pop(i)
        nums.append(0)
    print (nums)

解法2:

def moveZeroes(nums):
    for i in nums:
        if i==0:
            nums.append(0)
            nums.pop(0)
    print (nums)

解法2的一种错误形式:

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
           for i in range(len(nums)):
            if nums[i] == 0:
                nums.pop(i)
                nums.append(0)

错在遍历索引时,nums在改变,当出现nums=[0,0,1],会陷入死循环[0,1,0]无法跳出。

16.第三大的数:给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是O(n)。https://leetcode-cn.com/problems/third-maximum-number/

解法1:这个解法的时间复杂度不是O(n)

class Solution:
    def thirdMax(self, nums: List[int]) -> int:
        nums_ = list(set(nums))
        nums_.sort()
        if len(nums_) < 3: return max(nums_)
        return nums_[-3]

解法2:这个时间复杂度符合要求,参考链接:https://leetcode-cn.com/problems/third-maximum-number/solution/python3de-2chong-onjie-fa-by-liaogx/

def thirdMax(nums):
    temp = set()
    for i in nums:
        temp.add(i)
        if len(temp) > 3 :
            temp.remove(min(temp))
    if len(temp) < 3:
        return max(temp)
    return min(temp)

17.杨辉三角:给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。在杨辉三角中,每个数是它左上方和右上方的数的和。题目链接:https://leetcode-cn.com/problems/pascals-triangle/
解法:模拟法(动态规划),参考链接:https://leetcode-cn.com/problems/pascals-triangle/solution/mo-ni-fa-dong-tai-gui-hua-po-shi-de-xie-fa-python3/

def generate(numRows):
    dp = [[0]*n for n in range(1,numRows+1)]
    for i in range(numRows):
        dp[i][0] = dp[i][-1] =1
    for i in range(0,numRows):
        for j in range(i):
            if(dp[i][j] == 0):
                dp[i][j]=dp[i-1][j-1]+dp[i-1][j]
    return dp

18.杨辉三角II:给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。在杨辉三角中,每个数是它左上方和右上方的数的和。题目链接:https://leetcode-cn.com/problems/pascals-triangle-ii/
解法1:在上一题的基础上,先构造出杨辉三角,然后按索引寻找。(太low,自己写的。。。)

class Solution:
    def getRow(self, rowIndex: int) -> List[int]:
        dp = [[0]*n for n in range(1,rowIndex+2)]
        for i in range(rowIndex+1):
            dp[i][0] = dp[i][-1] = 1
        for i in range(rowIndex+1):
            for j in range(i):
                if dp[i][j] == 0:
                    dp[i][j] = dp[i-1][j-1] + dp[i-1][j]
        return dp[rowIndex]

解法2:言简意赅,参考链接:https://leetcode-cn.com/problems/pascals-triangle-ii/solution/python3-yang-hui-san-jiao-ii-by-leicj/

def getRow(rowIndex):
    r=[1]
    for i in range(1,rowIndex+1):
        r.insert(0,0)
        for j in range(i):
            r[j] = r[j]+r[j+1]
    return r

19.找到所有数组中消失的数字: 给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。找到所有在 [1, n] 范围之间没有出现在数组中的数字。您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内。题目链接:https://leetcode-cn.com/problems/find-all-numbers-disappeared-in-an-array/

解法:基本想法就是利用python结果的特点

class Solution:
    def findDisappearedNumbers(self, nums: List[int]) -> List[int]:
        if not nums: return []
        n = len(nums)+1
        l = [i for i in range(n)]
        return list(set(l[1:])-set(nums))

20.最大连续1的个数:给定一个二进制数组, 计算其中最大连续1的个数。注意:(1)输入的数组只包含 0 和1;(2)输入数组的长度是正整数,且不超过 10,000。题目链接:https://leetcode-cn.com/problems/max-consecutive-ones/

解法1:用一个指针记录当前1的个数,比较保留大的

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

解法2:将列表转为字符串,按’0’分割字符串,然后计算长度
参考链接:https://leetcode-cn.com/problems/max-consecutive-ones/solution/zui-da-lian-xu-1de-ge-shu-by-leetcode/

class Solution:
    def findMaxConsecutiveOnes(self, nums: List[int]) -> int:
        return max(map(len, ''.join(map(str, nums)).split('0')))

重点函数:map(),参考链接:https://blog.csdn.net/Galen_xia/article/details/103601096

发布了59 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Galen_xia/article/details/103467201
今日推荐