Leetcode hot100 多数元素/相交链表/反转链表

169. 多数元素

我用的就是字典,哈希

python 复制代码
class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        cnt=dict()
        n=len(nums)
        for num in nums:
            if num in cnt:
                cnt[num]+=1
            else:
                cnt[num]=1
        for num in cnt:
            if cnt[num]>n/2:
                return num

排序也可以,第n/2下取整位置上的是众数 O(nlogn),空间复杂度可以降低到O(logn),自写堆排序降低到O(1)

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

分治法

python 复制代码
class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        def majority_element_rec(lo, hi) -> int:
            # base case; the only element in an array of size 1 is the majority
            # element.
            if lo == hi:
                return nums[lo]

            # recurse on left and right halves of this slice.
            mid = (hi - lo) // 2 + lo
            left = majority_element_rec(lo, mid)
            right = majority_element_rec(mid + 1, hi)

            # if the two halves agree on the majority element, return it.
            if left == right:
                return left

            # otherwise, count each element and return the "winner".
            left_count = sum(1 for i in range(lo, hi + 1) if nums[i] == left)
            right_count = sum(1 for i in range(lo, hi + 1) if nums[i] == right)

            return left if left_count > right_count else right

        return majority_element_rec(0, len(nums) - 1)

随机法是搞笑的吧。。

还有Boyer-Moore 投票算法,妙

160.相交链表

python 复制代码
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> Optional[ListNode]:
        #先把数字都拿出来,倒着找到数字一样的最后一个,然后把指针指过来看是不是同一个节点,如果不是就双指针++
        lista=[]
        listb=[]
        p=headA
        while p!=None:
            lista.append(p.val)
            p=p.next

        p=headB
        while p!=None:
            listb.append(p.val)
            p=p.next
        lena=len(lista)
        lenb=len(listb)
        i=lena-1
        j=lenb-1
        while i>=1 and j>=1:
            if lista[i]==listb[j]:
                i-=1
                j-=1
            else:
                break
        
        p=headA
        for cnt in range(0,i):
            p=p.next
        q=headB
        for cnt in range(0,j):
            q=q.next
        while p!=q:
            p=p.next
            q=q.next

        return p
        

哈希更好

然后双指针更天才,算法天才,想不到

评论有人说,让长的先走s步,s是多的长度,感觉也可以

206.反转链表

O(n)

python 复制代码
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
        if head!=None:
            p=head 
            q=p.next
            while q!=None :
                r=q.next
                if p==head:
                    p.next=None
                q.next=p
                p=q
                q=r
            head=p
        return head

那个递归思考量有点大,看着答案都想了半天,而且占空间还多。

相关推荐
倒头就睡的小比特3 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼3 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
旖旎夜光3 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark3 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her13 天前
并查集-听课笔记
笔记·算法·并查集
码流子3 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven3 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark3 天前
从算法设计模式看编程思维的抽象能力4
算法
2601_962218613 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法