2021-05-14

一、英语

1、by way of:作为、以求……
2、take a musical turn:朝着……方向转变
3、musical:喜欢音乐的,有音乐天赋的
4、keep your breath to cool your porridge:少管闲事

二、算法题目

1、739:栈

class Solution:
    #用stack维护index的递减序列
    #比较的时候根据数据大小比较,但是储存的内容是index
    def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
        stack = []
        cur = 0
        n = len(temperatures)
        res = [1]*n
        for i in range(n):
            while stack:
                cur = stack[-1]
                if temperatures[i]<=temperatures[cur]:
                    break
                res[cur] = i-cur
                stack.pop()
            stack.append(i)
        #栈中剩下的是没有更高天气的
        for i in stack:
            res[i] = 0
        return res

2、23:链表,归并,堆排序

方法一:直接使用指针进行链表排序(C++)
时间复杂度: O ( k 2 n ) O(k^2n) O(k2n)
空间复杂度: O ( 1 ) O(1) O(1)

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
//合并两个列表
    ListNode* merge(ListNode* a,ListNode* b)
    {
        if((!a)||(!b))
        return a?a:b;
        ListNode head;
        ListNode* cur = &head;
        ListNode* aptr = a;
        ListNode* bptr = b;
        while(aptr && bptr)
        {
            if(aptr->val<=bptr->val)
            {
                cur->next = aptr;
                aptr = aptr->next;
            }
            else
            {
                cur->next = bptr;
                bptr = bptr->next;
            }
            cur = cur->next;
        }
        cur->next = aptr?aptr:bptr;
        return head.next;
    }
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        //直接原地调整
        //head指针指向合并之后的头部
        //cur指向当前的位置
        ListNode* ans = nullptr;
        int n = lists.size();
        for(int i = 0;i<n;++i)
        {
            ans = merge(ans,lists[i]);
        }
        return ans;
    }
};

方法二:归并排序
时间复杂度: O ( n k l o g k ) O(nklogk) O(nklogk)
空间复杂度: O ( l o g k ) O(logk) O(logk)
相较方法一,空间换了部分时间

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    #方法二:使用归并排序
    #归并排序首先下分下分,然后再向上合并
    #python对于list函数传参传的是引用
    def merge(self,l,r):
        if not l:
            return r
        if not r:
            return l
        #合并两个列表
        i,j = l,r
        tmp = ListNode()
        cur = tmp
        #tmp = []
        while i!=None and j!=None:
            if i.val<=j.val:
                cur.next = i
                i = i.next
            else:
                cur.next = j
                j = j.next
            cur = cur.next
        while i!=None:
            cur.next = i
            i = i.next
            cur = cur.next
        while j!=None:
            cur.next = j
            j = j.next
            cur = cur.next
        return tmp.next
    def mergesort(self,num,l,r):
        if l== r:
            return num[l]
        if l>r:
            return None
        mid = (int)((l+r)/2)
        #归并:先分
        l_num = self.mergesort(num,l,mid)
        r_num = self.mergesort(num,mid+1,r)
        #后合
        return self.merge(l_num,r_num)

        
    def mergeKLists(self, lists: List[ListNode]) -> ListNode:
        n = len(lists)
        return self.mergesort(lists,0,n-1)

方法三:堆排序,将每个链表的最小的值加入堆中
时间复杂度:k个链表,那么堆中就有k个元素,删除和加入一个的复杂度为log(k),一共进行nk次,所以时间复杂度为nklog(k)
空间复杂度:堆空间o(k)

ListNode* mergeKLists(vector<ListNode*>& lists) 
    {
        struct tmp
        {
            int val;
            ListNode* p;
            bool operator < (const tmp & other) const
            {
                return val>other.val;
            }
        };
        priority_queue<tmp> q;
        int n = lists.size();
        for(int i = 0;i<n;++i)
        if (lists[i])
        q.push({lists[i]->val,lists[i]});
        ListNode head;
        ListNode* cur = &head;
        while(!q.empty())
        {
            auto f = q.top();
            q.pop();
            cur->next = f.p;
            cur = cur->next;
            if(f.p->next)
            q.push({f.p->next->val,f.p->next});
        }
        return head.next;
    }

加油!
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值