美文网首页
一道简单的搜索题引发的三种解法

一道简单的搜索题引发的三种解法

作者: yousa_ | 来源:发表于2020-02-21 10:33 被阅读0次

昨天做剑指offer上的一道关于搜索的题目,看似炒鸡简单,但是如何优化时间、如何优化空间、如何选择策略,作者讨论了两种思路,再加上我自己想的一种思路,让这道题变得相当经典。


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:ShidongDu time:2020/2/21
'''
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。

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

示例 1:

输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
输出: 2
 
限制:

1 <= 数组长度 <= 50000

注意:本题与主站 169 题相同:https://leetcode-cn.com/problems/majority-element/
'''
from typing import List
import random

# 方法一:使用Partition(随机快速排序)法

# class Solution:
#     def majorityElement(self, nums: List[int]) -> int:
#         length = len(nums)
#         if not self.CheckInvalidArray(nums, length): return 0
#
#         middle = length >> 1
#         start = 0
#         end = length - 1
#         index = self.Partition(nums, length, start, end)
#
#         while index != middle:
#             if index > middle:
#                 end = index - 1
#                 index = self.Partition(nums, length, start, end)
#             else:
#                 start = index + 1
#                 index = self.Partition(nums, length, start, end)
#
#         result = nums[middle]
#         if not self.CheckMoreThanHalf(nums, length, result): result = 0
#         return result
#
#     def Partition(self, data: List[int], length: int, start: int,  end: int):
#         if not data or length<=0 or start<0 or end>=length: return False
#
#         index = random.randint(start, end)
#         data[index], data[end] = data[end], data[index]
#         small = start - 1
#         for index in range(start, end):
#             if data[index] < data[end]:
#                 small += 1
#                 if small != index:
#                     data[index], data[small] = data[small], data[index]
#
#         small += 1
#         data[small], data[end] = data[end], data[small]
#         return small
#
#     def CheckInvalidArray(self, numbers, length):
#         '''
#         检测是否符合规范
#         :param numbers:
#         :param length:
#         :return:
#         '''
        # return True
    #
    # def CheckMoreThanHalf(self, nums, length, number):
    #     '''
    #     检查超过一半数字的是否存在
    #     :param nums:
    #     :param length:
    #     :param number:
    #     :return:
    #     '''
        # return True

pass

# 方法二:使用哈希表
# 时间复杂度o(n),空间复杂度o(n)
# class Solution:
#     def majorityElement(self, nums: List[int]) -> int:
#         hash_dict = {}
#         for num in nums:
#             if num in hash_dict:
#                 hash_dict[num] += 1
#             else:
#                 hash_dict[num] = 1
#         return max(hash_dict, key=lambda x: hash_dict[x])
#

pass

# 方法三:使用临时计数器
# 时间复杂度o(n),空间复杂度o(1)
class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        if not nums: return 0
        result = nums[0]
        times = 1
        for i in range(1, len(nums)):
            if nums[i] == result:
                times += 1
            else:
                times -= 1
            if times == 0:
                times = 1
                result = nums[i]

        return result



solution = Solution()
res = solution.majorityElement([1,1,1,2,3,3,3,3,3,3,2])
print(res)

相关文章

  • 一道简单的搜索题引发的三种解法

    昨天做剑指offer上的一道关于搜索的题目,看似炒鸡简单,但是如何优化时间、如何优化空间、如何选择策略,作者讨论了...

  • leetcode212 单词搜索II

    题目 单词搜索II 暴力解法 暴力解法就是用leetcode79 单词搜索这题的搜索一个单词的dfs方法,挨个搜索...

  • 52综合应用凑微分公式的推导

    一个题的三种解法,不错

  • 实现 sqrt(x):二分查找法和牛顿法

    最近忙里偷闲,每天刷一道 LeetCode 的简单题保持手感,发现简单题虽然很容易 AC,但若去了解其所有的解法,...

  • 442. Find All Duplicates in an A

    和448很像的一道题,比448还简单点,不知道这道题里的不用额外空间是什么情况,看别人的解法很多都用了的。 我的解法

  • 32.LeetCode559. N叉树的最大深度.

    标签: 树 深度优先搜索 广度优先搜索 难度: 简单 题目描述 我的解法: 递归 其他解法 暂略。

  • 283. Move Zeroes

    挺简单一道题,从理论上来说我的写法移动次数最少,看看人家怎么写的吧。 我的解法 人家的解法 显然比我写得好看。。。...

  • 写给初写算法自己的忠告

    1.吃透一道题目比乱刷十道题目更有价值。 2.刷题方法: 自己的解法 网上好的解法 自己的解法可以优化的地方 不停...

  • leetcode-买卖股票的最佳时机

    本次分享一道经典的算法题,准确的说是一道题的不同条件下的不同求法。这道题一共有六种情况,每种情况都是不同的解法,在...

  • 一道逻辑题的python解法

    前言: 好早之前看到的一个逻辑题:有两个2到99之间的整数,a知道这两个数的和,b知道这两个数的积。 第一句:a对...

网友评论

      本文标题:一道简单的搜索题引发的三种解法

      本文链接:https://www.haomeiwen.com/subject/njnqqhtx.html