国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

355. Design Twitter , 用23. Merge k Sorted Lists和OO

1fe1se / 632人閱讀

摘要:的想法就是用每次得到最小的鏈表頭的值,輸出。每個(gè)都有一個(gè)關(guān)注人列表,用儲(chǔ)存。用戶(hù)可以發(fā)消息,關(guān)注別人,取消關(guān)注別人。可以系統(tǒng)得到關(guān)注人的消息合集,這個(gè)方法必須在這個(gè)層級(jí)。因?yàn)橛脩?hù)只知道自己的信息。

Merge k Sorted Lists

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        if(lists == null) return null;
        // O(k) construct heap, m*logk do iterate,  Space O(k)
        // lamda expression is super slow 99ms vs 26ms Comparator
        // PriorityQueue pq = new PriorityQueue((a,b) -> (a.val-b.val));
        PriorityQueue pq = new PriorityQueue(new Comparator(){
            @Override
            public int compare(ListNode l1, ListNode l2) {
                return l1.val - l2.val;
            }
        });
        
        for(ListNode l:lists) {
            if(l != null) pq.offer(l);
        }
        // every new list need a dummy node
        ListNode dummy = new ListNode(0);
        ListNode pre = dummy;
        while(!pq.isEmpty()){
            ListNode cur = pq.poll();
            pre.next = cur;
            if(cur.next != null) pq.offer(cur.next);
            pre = pre.next;
        }
        
        return dummy.next;
    }
}
Merge k Sorted Lists的想法就是用PriorityQueue每次得到最小的鏈表頭的值,輸出。如果next!=null,繼續(xù)放到PriorityQueue里。
Twitter 本質(zhì)上就是一個(gè)消息列表,按時(shí)間順序從關(guān)注人列表里得到他們的tweets并整合顯示。
每個(gè)user都有一個(gè)關(guān)注人列表,用hashset儲(chǔ)存。還有一個(gè)tweets消息列表,這里按時(shí)間線(xiàn)就已經(jīng)形成一個(gè)Sorted List.
一個(gè)user要得到最新的tweets, 首先找到關(guān)注人,把他們的tweets消息列表存到PriorityQueue里,就變成了Merge k Sorted Lists.
這里用OOD是因?yàn)楦咏F(xiàn)實(shí)情況。twitter就是一個(gè)用戶(hù)看到關(guān)注人消息集合的媒體。
基本的entity就是消息tweets和用戶(hù)user。
tweets要體現(xiàn)出時(shí)間線(xiàn),就要模擬linkedlist。
user用戶(hù)可以發(fā)消息,關(guān)注別人,取消關(guān)注別人。
user可以twitter系統(tǒng)得到關(guān)注人的消息合集,這個(gè)方法必須在twitter這個(gè)層級(jí)。因?yàn)橛脩?hù)只知道自己的信息。
public class Twitter {
    private static int timestamp = 0;
    
    private Map userMap;
    
    class Tweet{
        public int id;
        public int time;
        public Tweet next;
        
        public Tweet(int id) {
            this.id = id;
            time = timestamp++;
            next = null;
        }
    }
    
    public class User{
        public int id;
        public Set followed;
        public Tweet tweet_head;
        
        public User(int id) {
            this.id = id;
            followed = new HashSet();
            follow(id);
            tweet_head = null;
        }
        
        public void follow(int id) {
            followed.add(id);
        }
        
        public void unfollow(int id){
            followed.remove(id);
        }
        
        public void post(int id){
            Tweet tweet = new Tweet(id);
            tweet.next = tweet_head;
            tweet_head = tweet;
        }
    }
    
    
    
    /** Initialize your data structure here. */
    public Twitter() {
        userMap = new HashMap();
    }
    
    /** Compose a new tweet. */
    public void postTweet(int userId, int tweetId) {
        if(!userMap.containsKey(userId)){
            User u = new User(userId);
            userMap.put(userId, u);
        }
        userMap.get(userId).post(tweetId);
    }
    
    /** Retrieve the 10 most recent tweet ids in the user"s news feed. Each item in the news feed must be posted by users who the user followed or by the user herself. Tweets must be ordered from most recent to least recent. */
    public List getNewsFeed(int userId) {
        List news = new LinkedList<>();
        if(!userMap.containsKey(userId)){
            return news;
        }
        
        Set users = userMap.get(userId).followed;
        PriorityQueue pq = new PriorityQueue(users.size(), (a,b) -> (b.time - a.time));
        for(int u:users){
            Tweet t = userMap.get(u).tweet_head;
            if(t != null)  {
                pq.offer(t);
            }
        }
        
        int n = 0;
        while(!pq.isEmpty() && n < 10) {
            Tweet t = pq.poll();
            news.add(t.id);
            if(t.next != null) {
                pq.offer(t.next);
            }
            n++;
        }
        
        return news;
    }
    
    /** Follower follows a followee. If the operation is invalid, it should be a no-op. */
    public void follow(int followerId, int followeeId) {
        if(!userMap.containsKey(followerId)){
            User u = new User(followerId);
            userMap.put(followerId, u);
        }
        if(!userMap.containsKey(followeeId)){
            User u = new User(followeeId);
            userMap.put(followeeId, u);
        }
        userMap.get(followerId).follow(followeeId);
    }
    
    /** Follower unfollows a followee. If the operation is invalid, it should be a no-op. */
    public void unfollow(int followerId, int followeeId) {
        if(!userMap.containsKey(followerId) || followerId == followeeId){
            return;
        }
        userMap.get(followerId).unfollow(followeeId);
    }
}

/**
 * Your Twitter object will be instantiated and called as such:
 * Twitter obj = new Twitter();
 * obj.postTweet(userId,tweetId);
 * List param_2 = obj.getNewsFeed(userId);
 * obj.follow(followerId,followeeId);
 * obj.unfollow(followerId,followeeId);
 */

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/66930.html

相關(guān)文章

  • [LeetCode] 23. Merge k Sorted Lists

    摘要:思路這題中的中,個(gè)還有其中個(gè)別的等于的情況,所以要判斷一下再加入代碼 Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. Heap Time Complexity: Update the heap costs O(nklogk) Space ...

    Codeing_ls 評(píng)論0 收藏0
  • 23. Merge k Sorted Lists

    摘要:題目合并排序鏈表并返回一個(gè)排序列表。分析和描述它的復(fù)雜性。直接對(duì)個(gè)鏈表合并,找到個(gè)鏈表頭最小的,將值追加到放在新創(chuàng)建的鏈表中,并把頭移到下一個(gè)節(jié)點(diǎn),直到所有的鏈表頭運(yùn)行后發(fā)現(xiàn)超時(shí)嘗試兩兩合并兩個(gè)鏈表,知道最終合并成一個(gè)運(yùn)行通過(guò) 題目 Merge k sorted linked lists and return it as one sorted list. Analyze and des...

    qingshanli1988 評(píng)論0 收藏0
  • LeetCode 之 JavaScript 解答第23題 —— 合并K個(gè)有序鏈表(Merge K S

    摘要:分治算法遞歸每層操作分解將原問(wèn)題分解成一系列的子問(wèn)題。分治算法滿(mǎn)足的條件可分解原問(wèn)題與分解成的小問(wèn)題具有相同的模式無(wú)關(guān)聯(lián)原問(wèn)題分解成的子問(wèn)題可以獨(dú)立求解,子問(wèn)題之間沒(méi)有相關(guān)性,這一點(diǎn)是分治算法跟動(dòng)態(tài)規(guī)劃的明顯區(qū)別。 Time:2019/4/10Title: Merge K Sorted ListsDifficulty: DifficultyAuthor: 小鹿 題目:Merge K...

    zhou_you 評(píng)論0 收藏0
  • [Leetcode] Merge Two Sorted Lists Merge K Sorted L

    摘要:注意因?yàn)槎阎惺擎湵砉?jié)點(diǎn),我們?cè)诔跏蓟褧r(shí)還要新建一個(gè)的類(lèi)。代碼初始化大小為的堆拿出堆頂元素將堆頂元素的下一個(gè)加入堆中 Merge Two Sorted Lists 最新更新請(qǐng)見(jiàn):https://yanjia.me/zh/2019/01/... Merge two sorted linked lists and return it as a new list. The new list...

    stefanieliang 評(píng)論0 收藏0
  • leetcode 341 Flatten Nested List Iterator 以及其他Iter

    摘要:返回的是表示是否走到了結(jié)尾。起到的就是緩存作用,因?yàn)檎{(diào)用之后馬上就走到下一個(gè)了。如果調(diào)用,返回用得到和最初的輸入相同的做相同的步驟存入不斷拆開(kāi)得到結(jié)果。思想就是來(lái)自括號(hào),后面也會(huì)跟進(jìn)的專(zhuān)題 Iterator其實(shí)就是一個(gè)單鏈表,無(wú)法回頭看。java里很多數(shù)據(jù)結(jié)構(gòu)都有這個(gè)接口,使用時(shí)需要initalize,得到一個(gè)iterator. 調(diào)用next()返回的是一個(gè)object, 指向的是下一...

    chaosx110 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<