leetcode--简单经典问题合集

题目一描述

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

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

题目分析

有两种思路 一种是哈希查找,另一种是摩尔投票法。
摩尔投票法:
核心就是对拼消耗。
玩一个诸侯争霸的游戏,假设你方人口超过总人口一半以上,并且能保证每个人口出去干仗都能一对一同归于尽。最后还有人活下来的国家就是胜利。
那就大混战呗,最差所有人都联合起来对付你(对应你每次选择作为计数器的数都是众数),或者其他国家也会相互攻击(会选择其他数作为计数器的数),但是只要你们不要内斗,最后肯定你赢。
最后能剩下的必定是自己人。(来自网友评论)

代码:

class Solution(object):
    def majorityElement1(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        ## 哈希储存
        dic = {}
        for num in nums:
            if dic.get(num) == None:
                dic[num] = 1
            else:
                dic[num] += 1
        res = 0
        val = 0
        for item in dic.items():## 这个地方对字典进行二值同时遍历。注意是items()函数
            if item[1] > val:
                res,val = item[0], item[1]
        return res 
    def majorityElement2(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """    
        ## 摩尔投票
        res = 0
        val = 0
        for num in nums:
            if val == 0:
                res = num
                val = 1
            elif res == num:
                val += 1
            else:
                val -= 1
        return res    
    def majorityElement3(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """    
        ## python特色
        nums.sort()
        return nums[len(nums)//2]                 

题目二描述

请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。
链表至少包含两个节点。
链表中所有节点的值都是唯一的。
给定的节点为非末尾节点并且一定是链表中的一个有效节点。
不要从你的函数中返回任何结果。
题目有些狗 直接看代码吧 没啥意思


class Solution(object):
    def deleteNode(self, node):
        """
        :type node: ListNode
        :rtype: void Do not return anything, modify node in-place instead.
        """
        node.val = node.next.val
        node.next = node.next.next

题目三描述

给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。
示例:
输入: [1,2,3,4]
输出: [24,12,8,6]
说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。

class Solution(object):
       
            
    def productExceptSelf(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        output = []
        mul = 1
        for v in nums:
            
            output.append(mul)
            mul *= v
            
        mul = 1
        for i in range(len(nums) - 1, -1, -1):
            output[i] *= mul
            mul *= nums[i]
        return output    
            

此题关键在于控制时间复杂度在o(n)以内 ,算法关键在于不要浪费乘法,此方法保留每一步乘法的远算结果

题目四描述

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。
示例 1:
输入:[“h”,“e”,“l”,“l”,“o”]
输出:[“o”,“l”,“l”,“e”,“h”]

题目分析

首尾指针,相互交换,相遇结束
代码如下

class Solution(object):
    def reverseString(self, s):
        """
        :type s: List[str]
        :rtype: None Do not return anything, modify s in-place instead.
        """
        left = 0
        right = len(s)-1
        while left < right:
            s[left], s[right] = s[right], s[left]
            left += 1
            right -= 1

你可能感兴趣的:(leetcode)