剑指offer(十二)

56. 滑动窗口的最大值

这题我觉得最麻烦的是,size使用的 unsigned int的类型,导致后面有点麻烦,所以我直接转成int型了。

class Solution {
public:
    vector<int> maxInWindows(const vector<int>& num, unsigned int size)
    {
        string str=to_string(size);
        int s=atoi(str.c_str());
        if(num.size()<=0 || s<=0 || s>num.size()) return {};
        if(s==1) return num;
        vector<int> res;                
        int maxindex=0;
        for(int j=1;j<s && j<num.size();j++)
            maxindex=num[maxindex]>num[j]?maxindex:j;
        res.push_back(num[maxindex]);
        
        for(int i=s;i<num.size();i++){
            if(num[i]>=num[maxindex]){
                maxindex=i;
                res.push_back(num[maxindex]);
            }
            else{
                if(maxindex!=i-s)
                    res.push_back(num[maxindex]);
                else{
                    maxindex=i-s+1;
                    for(int j=i-s+2;j<=i;j++)
                        maxindex=num[maxindex]>num[j]?maxindex:j;
                    res.push_back(num[maxindex]);
                }
            }
        }
        return res;
    }
};

书上的思路,我写的有点混乱。
思想是index.front()永远是序列最大值
如果当前值比之前的最大值大,那么清空index,存入当前的下标
如果当前值小,那么比较当前值与index中末尾值的大小。若当前值大则删去末尾值,直到末尾值大于当前值,插入当前值
当最大值即index的第一个位置的值已不在序列范围内,删除该值。

class Solution {
public:
    vector<int> maxInWindows(const vector<int>& num, unsigned int size)
    {
        string str=to_string(size);
        int s=atoi(str.c_str());
        
        if(num.size()<=0 || s<=0 || s>num.size()) return {};
        if(s==1) return num;
        
        vector<int> res; 
        deque<int> index;
        index.push_back(0);
        
        for(int i=1;i<num.size();i++){
            if(index.front()<=i-s) index.pop_front();
            if(num[i]>=num[index.front()]){
                index.clear();
                index.push_back(i);
            }
            else{
                while(index.size()>0 && num[i]>num[index.back()])
                    index.pop_back();
                index.push_back(i);
            }
            if(i>=s-1)
                res.push_back(num[index.front()]);
        }
        return res;
    }
};

57. 扑克牌顺子

自己的想法,先冒泡排序,再根据0的数量判断顺子是否成立。

class Solution {
public:
    void swap(vector<int> &numbers,int i,int j){
        int temp=numbers[i];
        numbers[i]=numbers[j];
        numbers[j]=temp;
    }
    bool IsContinuous( vector<int> numbers ) {
        if(numbers.size()!=5) return false;
        //排序
        for(int i=4;i>0;i--){
            for(int j=0;j<i;j++){
                if(numbers[j]>numbers[j+1])
                    swap(numbers,j,j+1);
            }
        }
        //0
        int count0=0,index=0,temp=1;
        while(index<4){
            if(numbers[index]==0){
                count0++;
                index++;
            }
            else{
                if(numbers[index+1]==numbers[index]+temp){
                    temp=1;
                    index++;
                }
                else{
                    if(count0>0){
                        count0--;
                        temp++;
                    }
                    else return false;
                }
            }
        }
        return true;
    }
};

58. 孩子们的游戏(圆圈中最后剩下的数)

直接按照题目的思路用链表写的代码,一直以来很害怕链表,改了两下就成功了相当开心。

class Solution {
public:
    int LastRemaining_Solution(int n, int m)
    {
        if(n<1 || m<1) return -1;
        ListNode* phead=new ListNode(0);
        phead->next=NULL;
        ListNode* head=phead;
        ListNode* temp;
        for(int i=1;i<n;i++){
            temp=new ListNode(i);
            head->next=temp;
            head=head->next;
        }
        head->next=phead;
        head=head->next;
        int count=0;
        while(head!=NULL){
            if(count==m-2){
                if(head==head->next->next){
                    head->next=NULL;
                    break;
                }
                else
                    head->next=head->next->next;
                count=-1;
            }
            head=head->next;
            count++;
        }
        return head->val;
    }
};

59. 求1+2+3+4+~+n

class Solution {
public:
    int Sum_Solution(int n) {
        //短路求值,与的判断条件下,当前面的条件判断不符合,后面将不计算。
        int res=n;
        res && (res+=Sum_Solution(n-1));
        return res;
    } 
};

60. 不用加减乘除做加法

class Solution {
public:
    int Add(int num1, int num2)
    {
        if(num1==num2) return num1<<1;
        //以 异或 算出 不进位的和
        //以 与 算出进位的位置
        int sum,carry;
        while(num2!=0){
            //当不再有进位时停止
            sum=num1^num2;
            carry=(num1&num2)<<1;
            num1=sum;
            num2=carry;
        }
        return num1;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章