221最大正方形;146LRU緩存機制;238除自身以外數組的乘積;309最佳買賣股票時機含冷凍期;347前 K 個高頻元素

在一個由 0 和 1 組成的二維矩陣內,找到只包含 1 的最大正方形,並返回其面積。

示例:

輸入: 

1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0

輸出: 4

class Solution {//一維 動態規劃
public:
    int maximalSquare(vector<vector<char>>& matrix) {
        int mSize=matrix.size();
        if(mSize==0)return 0;
        int nSize=matrix[0].size();
        if(nSize==0)return 0;
        vector<int>dp(nSize+1,0);//邊長
        int temp=dp[0],res=0;
        for(int i=0;i<mSize;++i)
            for(int j=1;j<=nSize;++j)
                if(matrix[i][j-1]=='1'){
                    swap(temp,dp[j]);
                    dp[j]=min(dp[j],min(dp[j-1],temp))+1;   
                    res=max(res,dp[j]);                 
                } 
                else{
                    temp=dp[j];
                    dp[j]=0;
                }                          
        return res*res;
    }
};

運用你所掌握的數據結構,設計和實現一個  LRU (最近最少使用) 緩存機制。它應該支持以下操作: 獲取數據 get 和 寫入數據 put 。

獲取數據 get(key) - 如果密鑰 (key) 存在於緩存中,則獲取密鑰的值(總是正數),否則返回 -1。
寫入數據 put(key, value) - 如果密鑰已經存在,則變更其數據值;如果密鑰不存在,則插入該組「密鑰/數據值」。當緩存容量達到上限時,它應該在寫入新數據之前刪除最久未使用的數據值,從而爲新的數據值留出空間。

 

進階:

你是否可以在 O(1) 時間複雜度內完成這兩種操作?

 

示例:

LRUCache cache = new LRUCache( 2 /* 緩存容量 */ );

cache.put(1, 1);
cache.put(2, 2);
cache.get(1);       // 返回  1
cache.put(3, 3);    // 該操作會使得密鑰 2 作廢
cache.get(2);       // 返回 -1 (未找到)
cache.put(4, 4);    // 該操作會使得密鑰 1 作廢
cache.get(1);       // 返回 -1 (未找到)
cache.get(3);       // 返回  3
cache.get(4);       // 返回  4

class LRUCache {
    int capacity;
    typedef list<pair<int,int>>::iterator it;//容器pop/push不會影響迭代器的值,除非把迭代器對應的節點給pop掉
    unordered_map<int,it>m;//key map映射到list *m[key]
    list<pair<int,int>> li;//pair<key,value>爲了可以list映射到map,即m.erase(list.back().first)
public:
    LRUCache(int capacity) {
        this->capacity=capacity;
    }    
    int get(int key) {
        if(m.count(key)==0)return -1;
        pair<int,int> temp=*m[key];
        li.erase(m[key]);
        li.push_front(temp);
        m[key]=li.begin();
        return temp.second;
    }    
    void put(int key, int value) {
        if(m.count(key)==0){            
            li.push_front(make_pair(key,value));
        }
        else{
            pair<int,int> temp=*m[key];
            temp.second=value;
            li.erase(m[key]);
            li.push_front(temp);
        }   
        m[key]=li.begin();        
        if(m.size()>capacity){
            m.erase(li.back().first);
            li.pop_back();
        }
    }
};

/**
 * Your LRUCache object will be instantiated and called as such:
 * LRUCache* obj = new LRUCache(capacity);
 * int param_1 = obj->get(key);
 * obj->put(key,value);
 */

給你一個長度爲 n 的整數數組 nums,其中 n > 1,返回輸出數組 output ,其中 output[i] 等於 nums 中除 nums[i] 之外其餘各元素的乘積。

 

示例:

輸入: [1,2,3,4]
輸出: [24,12,8,6]

 

提示:題目數據保證數組之中任意元素的全部前綴元素和後綴(甚至是整個數組)的乘積都在 32 位整數範圍內。

說明: 請不要使用除法,且在 O(n) 時間複雜度內完成此題。

進階:
你可以在常數空間複雜度內完成這個題目嗎?( 出於對空間複雜度分析的目的,輸出數組不被視爲額外空間。)

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int nSize=nums.size();
        vector<int>left(nSize);
        left[0]=nums[0];
        for(int i=1;i<nSize-1;++i)
            left[i]=left[i-1]*nums[i];
        int right=1;
        for(int i=nSize-1;i>0;--i){
            left[i]=left[i-1]*right;
            right*=nums[i];
        }
        left[0]=right;
        return left;
    }
};

給定一個整數數組,其中第 i 個元素代表了第 i 天的股票價格 。​

設計一個算法計算出最大利潤。在滿足以下約束條件下,你可以儘可能地完成更多的交易(多次買賣一支股票):


    你不能同時參與多筆交易(你必須在再次購買前出售掉之前的股票)。
    賣出股票後,你無法在第二天買入股票 (即冷凍期爲 1 天)。


示例:

輸入: [1,2,3,0,2]
輸出: 3 
解釋: 對應的交易狀態爲: [買入, 賣出, 冷凍期, 買入, 賣出]

class Solution {//一維 動態規劃
public:
    int maxProfit(vector<int>& prices) {
        int pSize=prices.size();
        if(pSize<=1)return 0;
        vector<vector<int>>dp(pSize,vector<int>(2,0));//0不持有股票
        dp[0][0]=0;
        dp[0][1]=-prices[0];
        dp[1][0]=max(dp[0][0],dp[0][1]+prices[1]);
        dp[1][1]=max(dp[0][1],dp[0][0]-prices[1]);
        for(int i=2;i<pSize;++i){
            dp[i][0]=max(dp[i-1][0],dp[i-1][1]+prices[i]);
            dp[i][1]=max(dp[i-1][1],dp[i-2][0]-prices[i]);
        }
        return dp[pSize-1][0];
    }
};
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int pSize=prices.size();
        if(pSize<=1)return 0;
        int dp00=0,dp01=-prices[0];
        int dp10=max(dp00,dp01+prices[1]);
        int dp11=max(dp01,dp00-prices[1]);
        for(int i=2;i<pSize;++i){
            dp01=dp10;//dp01當作temp,保存上一個dp10,最後賦值給dp00
            dp10=max(dp10,dp11+prices[i]);
            dp11=max(dp11,dp00-prices[i]);
            dp00=dp01;//
        }
        return dp10;
    }
};

給定一個非空的整數數組,返回其中出現頻率前 k 高的元素。

示例 1:

輸入: nums = [1,1,1,2,2,3], k = 2
輸出: [1,2]


示例 2:

輸入: nums = [1], k = 1
輸出: [1]

說明:


    你可以假設給定的 k 總是合理的,且 1 ≤ k ≤ 數組中不相同的元素的個數。
    你的算法的時間複雜度必須優於 O(n log n) , n 是數組的大小。

class Solution {
public:
    struct ValKey{
        int val;
        int key;
        ValKey():val(0),key(0){};
        ValKey(int v,int k):val(v),key(k){};
        bool operator >(const ValKey &vk)const{
            //if(val==vk.val)return key>vk.key;
            return val>vk.val;
        };
        bool operator <(const ValKey &vk)const{
            //if(val==vk.val)return key>vk.key;
            return val<vk.val;
        };
    };
    vector<int> topKFrequent(vector<int>& nums, int k) {
        unordered_map<int,int> m;
        priority_queue<ValKey,vector<ValKey>,greater<ValKey>>q;
        vector<int>res;
        for(auto i:nums)
            ++m[i];
        for(auto mi:m){
            if(q.size()<k)
                q.push(ValKey(mi.second,mi.first));
            else if(q.size()==k&&mi.second>q.top().val)
                q.pop(),q.push(ValKey(mi.second,mi.first));
        }
        while(q.size()){
            res.push_back(q.top().key);
            q.pop();
        }            
        return res;
    }
};
    

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章