美文网首页
Day2 用两个栈实现队列+连续子数组的最大和+数组中的逆序对

Day2 用两个栈实现队列+连续子数组的最大和+数组中的逆序对

作者: 吃掉夏天的怪物 | 来源:发表于2021-06-09 23:54 被阅读0次

剑指 Offer 09. 用两个栈实现队列(简单)

简单但没做对,下次需要仔细想一下细节

class CQueue {
    stack<int> stack1,stack2;
public:
    CQueue() {
        while (!stack1.empty()) {
            stack1.pop();
        }
        while (!stack2.empty()) {
            stack2.pop();
        }
    }
    
    void appendTail(int value) {
        stack1.push(value);
    }
    
    int deleteHead() {
        // 如果第二个栈为空
        if (stack2.empty()) {
            while (!stack1.empty()) {
                stack2.push(stack1.top());
                stack1.pop();
            }
        } 
        if (stack2.empty()) {
            return -1;
        } else {
            int deleteItem = stack2.top();
            stack2.pop();
            return deleteItem;
        }
    }
};

剑指 Offer 42. 连续子数组的最大和(简单)

简单但没一下想出来

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int res = INT_MIN;
        int sum = 0;
        for(auto it:nums){
            sum = sum > 0?sum+it:it;
            res = max(res,sum);
        }
        return res;

    }
};

剑指 Offer 51. 数组中的逆序对(困难)

不会不会不会 ❗ 这次就只学归并的方法
求逆序对,和数组的大小有关,所以可以边排序边计算个数

class Solution {
public:
    int chat(vector<int>&nums, vector<int>& temp,int l,int r){
        if(l >= r) return 0;
        int mid = l + (r-l)/2;
        int res = chat(nums,temp,l,mid) + chat(nums,temp,mid+1,r);
        for(int k = l; k <= r; k++){
            temp[k] = nums[k]; 
        }
        int i = l;
        int j = mid+1;
        for(int k = l; k <= r; k++){
            if(i == mid+1){nums[k] = temp[j++];}
            else if(j == r+1){nums[k] = temp[i++];}
            else{
                if(temp[i] > temp[j]){
                    nums[k] = temp[j++];
                    res += mid-i+1;
                }else{
                    nums[k] = temp[i++];
                }
            }
        }
        return res;
    }
    int reversePairs(vector<int>& nums) {
        int n = nums.size();
        if(n <= 0) return 0;
        vector<int> temp(n);
        return chat(nums,temp,0,n-1);

    }
};

相关文章

  • Day2 用两个栈实现队列+连续子数组的最大和+数组中的逆序对

    剑指 Offer 09. 用两个栈实现队列(简单)[https://leetcode-cn.com/problem...

  • 数据结构——栈和队列

    用数组实现栈和队列 用栈实现队列 用队列实现栈 栈和队列的经典算法题最小间距栈宠物收养所 数组实现栈和队列 用数组...

  • 用数组实现栈、队列

    用数组实现一个栈 用数组实现一个队列 用单链表实现给队列

  • 剑指offer python

    连续子数组最大和 二分查找 快排 二叉树的镜像 链表中环的入口结点 矩阵路径 两个栈实现队列 反转单链表 和为S的...

  • 剑指Offer——用两个栈来实现队列和旋转数组的最小数字

    用两个栈来实现队列 两个栈来实现一个队列github地址 旋转数组的最小数字 旋转数组的最小数字github地址

  • 实现链表_链表实现栈和队列_3

    之前用数组实现栈和队列,虽然有resize操作,但是其实还是静态数组,不是真正的动态。当我们用链表实现栈和队列的时...

  • 数组

    数组 数组如何实现随机访问 数组是一种线性数据结构,用连续的存储空间存储相同类型数据 线性表:数组、链表、队列、栈...

  • 数据结构java描述

    接口 栈 队列 集合 并查集 映射 数组 链表 栈 数组实现 链表实现 队列 数组实现 链表实现 二分搜索树 集合...

  • 数组

    数组如何实现随机访问 数组是一种线性数据结构,用连续的存储空间存储相同类型数据。 线性表:数组、链表、队列、栈 ;...

  • [剑指offer]刷题笔记

    连续子数组的最大和(常见✔) 最小的k个数 数组中出现次数超过一半的数字 数据流中的中位数(难♧) 连续子数组的最...

网友评论

      本文标题:Day2 用两个栈实现队列+连续子数组的最大和+数组中的逆序对

      本文链接:https://www.haomeiwen.com/subject/jlpdeltx.html