找到和最大的长度为K的子序列(修改版)

news/2024/6/17 17:07:24 标签: 算法, 散列表, leetcode

​​​​​​2099. 找到和最大的长度为 K 的子序列 - 力扣(LeetCode)

目录

 说明

思路

代码


 说明

和上一篇答案的主要不同是自己写了个pair提高了运行速度,代码核心部分并未改变。

首先放上运行结果:

思路

1. 利用pair,把元素值和其在原数组中的位置关联在一起.

2. 首先根据元素值val来构造最小堆,利用最小堆找出最大的k个元素;

3. 然后根据位置下标idx来调整最小堆;

4. 最后依次从堆顶取出元素值,放入最终的数组ans中.

代码

class Solution {
#define NOP 0
#define top 1
#define vacancy 0x7fffffff

    struct My_pair {
        int val;
        int idx;
        My_pair() :val(vacancy), idx(vacancy) {}
        My_pair(int v, int i) :val(v), idx(i) {}
        void form(int v, int i) {
            val = v;
            idx = i;
        }
    };
    My_pair make_My_pair(int v, int i) {
        return *new My_pair(v, i);
    }
    My_pair make_My_pair() {
        return *new My_pair();
    }

    enum subject { VAL, IDX };

    My_pair* minHeap;
    int k;

public:
    vector<int> maxSubsequence(vector<int>& nums, int K) {
        k = K;
        minHeap = new My_pair[k + 1];

        //build minHeap
        for (int idx = 0; idx != k; ++idx) {
            minHeap[idx + 1].form(nums[idx], idx);
        }
        for (int pos = k / 2; pos; --pos) {
            sink(minHeap[pos], pos, VAL);
        }
        //get k largest elements
        int size = nums.size();
        for (int idx = k; idx != size; ++idx) {
            My_pair intruder(nums[idx], idx);
            compare(intruder, minHeap[top], VAL) ?
                sink(intruder, top, VAL) : NOP;
        }

        //rectify minHeap with IDX
        for (int pos = k / 2; pos; --pos) {
            sink(minHeap[pos], pos, IDX);
        }
        //put elements into array successively
        vector<int> ans(k);
        for (int i = 0; i != k; ++i) {
            ans[i] = minHeap[top].val;
            sink(make_My_pair(), top, IDX);
        }

        return ans;
    }

    //core of priority queue
    int sink(My_pair pebble, int pos, subject X) {
        int bubble;
        while ((bubble = pos * 2) <= k) {
            bubble != k && compare(minHeap[bubble], minHeap[bubble + 1], X) ?
                ++bubble : NOP;
            if (compare(minHeap[bubble], pebble, X)) break;
            minHeap[pos] = minHeap[bubble];
            pos = bubble;
        }
        minHeap[pos] = pebble;
        return 0;
    }

    int compare(My_pair A, My_pair B, subject X) {
        return (!X && A.val > B.val) ||
            (X && A.idx > B.idx) ?
            1 : 0;
    }
};


http://www.niftyadmin.cn/n/1817165.html

相关文章

【Kotlin】坦克大战2:地图和我方坦克绘制

文章目录创建模型按照地图绘制我方坦克绘制创建模型 新建一个Wall类 class Wall {//位置var x:Int 100var y:Int 100//宽高var width:Int Config.blockvar height:Int Config.block//显示行为fun draw(){Painter.drawImage("img/wall.gif",x,y)} }我们在绘制墙…

【Kotlin】坦克大战3:移动和碰撞检测

文章目录移动碰撞检测实现碰撞逻辑移动 在接口中val&#xff0c;在实现的时候可以var 当按下WSAD这四个键时&#xff0c;坦克向上下左右移动&#xff0c;我们重写GameWindow的onKeyPressed方法 override fun onKeyPressed(event: KeyEvent) {//用户操作时when(event.code){K…

旋转数组-轮转数组

旋转数组 - 轮转数组 - 力扣&#xff08;LeetCode&#xff09; 目录 基本方法&#xff1a;开辟辅助数组 运行结果 代码 方案2&#xff1a;轮转替换 运行结果 代码 基本方法&#xff1a;开辟辅助数组 运行结果 代码 class Solution { public:void rotate(vector<int>…

数据流中的第K大元素

703. 数据流中的第 K 大元素 - 力扣&#xff08;LeetCode&#xff09; #define MIN 0x80000000 class KthLargest {int* minHeap;int K; public:KthLargest(int k, vector<int>& nums) {K k;minHeap new int[k 1];int size nums.size();int ini_scale min(size…

Tablayout-布局标签

文章目录先用起来属性常用属性设置文字和图片设置布局模式设置边距、宽度等设置指示器设置水波纹的属性使用style设置tablayout样式设置监听与ViewPager关联setCustomView&#xff08;&#xff09;自定义布局Tablayout继承自HorizontalScrollView&#xff0c;用作页面切换指示器…

第N个泰波那契数

1137. 第 N 个泰波那契数 - 力扣&#xff08;LeetCode&#xff09; 运行结果 代码 class Solution { public:int tribonacci(int n) {int T[] {0, 1, 1};if(n < 3) return T[n];int Tn_3 0, Tn_2 1, Tn_1 1, Tn;for(int i 3; i < n; i){Tn Tn_1 Tn_2 Tn_3;Tn_3…

找到和最大的长度为K的子序列

2099. 找到和最大的长度为 K 的子序列 - 力扣&#xff08;LeetCode&#xff09; 目录 运行结果 思路 代码 运行结果 思路 利用pair&#xff0c;把元素值和其在原数组中的位置关联在一起. 首先根据元素值val来构造最小堆&#xff0c;利用最小堆找出最大的k个元素&#xff1…

斐波那契数

509. 斐波那契数 - 力扣&#xff08;LeetCode&#xff09; 运行结果 代码 class Solution { public:int fib(int n) {if(n < 1) return 0;if(n 1) return 1;int Fn_1 1, Fn_2 0, Fn;for(int i 2; i < n; i){Fn Fn_1 Fn_2;Fn_2 Fn_1;Fn_1 Fn;}return Fn;} };