首页 > 其他分享 >力扣---2653. 滑动子数组的美丽值

力扣---2653. 滑动子数组的美丽值

时间:2023-04-25 18:35:33浏览次数:41  
标签:力扣 arr num2 nums 2653 --- int 数组 index2

给你一个长度为 n 的整数数组 nums ,请你求出每个长度为 k 的子数组的 美丽值 。

一个子数组的 美丽值 定义为:如果子数组中第 x 小整数 是 负数 ,那么美丽值为第 x 小的数,否则美丽值为 0 。

请你返回一个包含 n - k + 1 个整数的数组,依次 表示数组中从第一个下标开始,每个长度为 k 的子数组的 美丽值 。

子数组指的是数组中一段连续 非空 的元素序列。

 

示例 1:

输入:nums = [1,-1,-3,-2,3], k = 3, x = 2
输出:[-1,-2,-2]
解释:总共有 3 个 k = 3 的子数组。
第一个子数组是 [1, -1, -3] ,第二小的数是负数 -1 。
第二个子数组是 [-1, -3, -2] ,第二小的数是负数 -2 。
第三个子数组是 [-3, -2, 3] ,第二小的数是负数 -2 。
示例 2:

输入:nums = [-1,-2,-3,-4,-5], k = 2, x = 2
输出:[-1,-2,-3,-4]
解释:总共有 4 个 k = 2 的子数组。
[-1, -2] 中第二小的数是负数 -1 。
[-2, -3] 中第二小的数是负数 -2 。
[-3, -4] 中第二小的数是负数 -3 。
[-4, -5] 中第二小的数是负数 -4 。
示例 3:

输入:nums = [-3,1,2,-3,0,-3], k = 2, x = 1
输出:[-3,0,-3,-3,-3]
解释:总共有 5 个 k = 2 的子数组。
[-3, 1] 中最小的数是负数 -3 。
[1, 2] 中最小的数不是负数,所以美丽值为 0 。
[2, -3] 中最小的数是负数 -3 。
[-3, 0] 中最小的数是负数 -3 。
[0, -3] 中最小的数是负数 -3 。
 

提示:

n == nums.length 
1 <= n <= 105
1 <= k <= n
1 <= x <= k 
-50 <= nums[i] <= 50 

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/sliding-subarray-beauty
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


 

周赛第三题。前两题简单题。结果第三题被打回原形,再次成为一名光荣的两题选手。。。

初步思路是滑动窗口加二分查找。

即维护前 k 个数的排序。

时间复杂度应该是 O(n * k * log(k)),n 是数组长度,k 是需要维护的数组长度,log(k)是二分查找所需时间。

最后几个测试用例超时了。

改换思路。

由于数据范围是 -50 到 50 之间。因此可以用计数排序。

代码如下:

二分查找:

class Solution {
    public int[] getSubarrayBeauty (int[] nums, int k, int x) {
        int[] arr = new int[k];
        System.arraycopy(nums, 0, arr, 0, k);
        Arrays.sort(arr);
        int[] res = new int[nums.length - k + 1];
        res[0] = Math.min(arr[x - 1], 0);
        for (int i = k; i < nums.length; i++) {
            sort(arr, nums[i - k], nums[i]);
            res[i - k + 1] = Math.min(arr[x - 1], 0);
        }
        return res;
    }

// 搜索某个元素在数组中的位置。
    private int search (int[] arr, int num) {
        int len = arr.length;
        if (arr[0] > num) {
            return -1;
        } else if (arr[len - 1] < num) {
            return len;
        }
        int left = 0;
        int right = len - 1;
        while (left < right) {
            int tem = (left + right) / 2;
            if (arr[tem] < num) {
                left = tem + 1;
            } else if (arr[tem] > num) {
                right = tem - 1;
            } else {
                return tem;
            }
        }
        return left;
    }

// 对数组进行删除 num1,添加 num2 的维护。
    private void sort (int[] arr, int num1, int num2) {
        int index1 = search(arr, num1);
        int index2 = search(arr, num2);
        if (index2 <= -1) {
            for (int i = index1; i > 0; i --) {
                arr[i] = arr[i - 1];
            }
            arr[0] = num2;
        } else if (index2 >= arr.length) {
            for (int i = index1; i < arr.length - 1; i ++) {
                arr[i] = arr[i + 1];
            }
            arr[arr.length - 1] = num2;
        } else {
            if (arr[index2] <= num2) {
                if (index2 > index1) {
                    for (int i = index1; i < index2; i ++) {
                        arr[i] = arr[i + 1];
                    }
                    arr[index2] = num2;
                } else if (index2 < index1) {
                    for (int i = index1; i > index2 + 1; i --) {
                        arr[i] = arr[i - 1];
                    }
                    arr[index2 + 1] = num2;
                } else {
                    arr[index1] = num2;
                }
            } else {
                if (index2 > index1) {
                    for (int i = index1; i < index2 - 1; i++) {
                        arr[i] = arr[i + 1];
                    }
                    arr[index2 - 1] = num2;
                } else if (index2 < index1) {
                    for (int i = index1; i >index2; i --) {
                        arr[i] = arr[i - 1];
                    }
                    arr[index2] = num2;
                } else  {
                    arr[index1] = num2;
                }
            }
        }
    }
}

 计数排序:

class Solution {
    public int[] getSubarrayBeauty (int[] nums, int k, int x) {
        int[] arr = new int[101];
        for (int i = 0; i < k; i ++) {
            arr[nums[i] + 50] ++;
        }
        int[] res = new int[nums.length - k + 1];
        res[0] = Math.min(0, search(arr, x));
        for (int i = k; i < nums.length; i ++) {
            upDate(arr, nums[i - k], nums[i]);
            res[i - k + 1] = Math.min(0, search(arr, x));
        }
        return res;
    }
    private void upDate(int[] arr, int num1, int num2) {
        arr[num1 + 50] --;
        arr[num2 + 50] ++;
    }
    private int search(int[] arr, int x) {
        int count = 0;
        for (int i = 0; i < arr.length; i ++) {
            count += arr[i];
            if (count >= x) {
                return i - 50;
            }
        }
        return -1;
    }
}

 

标签:力扣,arr,num2,nums,2653,---,int,数组,index2
From: https://www.cnblogs.com/allWu/p/17353498.html

相关文章

  • 【谷歌插件开发】获取当前网站COOKIE并上报HTTP-API
    一背景由于本人每天需要登录网站查看数据并分析统计汇总,而每次机械式地搜索和简单计算,十分繁琐。我们可以写个定时任务,每天根据cookie获取网站数据并遍历统计。脚本得以成功执行的关键是需要获取到COOKIE故,写了个谷歌插件用来上报COOKIE二代码总目录三上代码manifest......
  • 分享:开源网关-应用管理篇
    需求痛点在这互联网高速发展的时代,企业业务系统多、渠道广,如何管理内外部调用端系统具有极大的挑战。数量方面:API网关需要对各端应用统一管理,例如对企业自身很多的前端应用,包括不限于web应用、移动APP、小程序,甚至第三方各端的应用进行管理,确保各应用有序、合规调用服务。安全方面:A......
  • 记录-因为写不出拖拽移动效果,我恶补了一下Dom中的各种距离
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助背景最近在项目中要实现一个拖拽头像的移动效果,一直对JSDom拖拽这一块不太熟悉,甚至在网上找一个示例,都看得云里雾里的,发现遇到最大的拦路虎就是JSDom各种各样的距离,让人头晕眼花,看到一个距离属性,大脑中的印象极......
  • 深度学习--RNN基础
    深度学习--RNN基础​ RNN(RecurrentNeutralNetwork,循环神经网络),主要应用于自然语言处理NLP。RNN表示方法1.编码因为Pytorch中没有String类型数据,需要引入序列表示法(sequencerepresentation)对文本进行表示。​ 表示方法:[seq_len:一句话的单词数,feature_len:每个单词的表示......
  • 多线程-从os层面理解常见概念
    如何创建一个线程在Linux系统中有一个方法,他有四个参数,其中第一个参数是利用指针传入,后期如果被修改也会同步修改,第三个参数和自己定义的run方法有关,后面会详细说。intpthread_create(pthread_t*thread,constpthread_attr_t*attr,void*(*start_routine)(void*),vo......
  • 分享总结:开源网关-应用管理篇
    需求痛点在这互联网高速发展的时代,企业业务系统多、渠道广,如何管理内外部调用端系统具有极大的挑战。数量方面:API网关需要对各端应用统一管理,例如对企业自身很多的前端应用,包括不限于web应用、移动APP、小程序,甚至第三方各端的应用进行管理,确保各应用有序、合规调用服务。安......
  • 2021牛客OI赛前集训营-提高组(第二场)第三题 树数树题解
    题目描述牛牛有一棵\(n\)个点的有根树,根为\(1\)。我们称一个长度为\(m\)的序列\(a\)是好的,当且仅当:\(\foralli\in(1,m]\),\(a_i\)为\(a_{i−1}\)的祖先或\(a_{i−1}\)是\(ai\)的祖先\(\forall1\leqi\ltj\leqm,a_i\neqa_j\)你需要帮助牛牛求出最长的......
  • 2021牛客OI赛前集训营-提高组(第三场) 第二题 交替 题解与结论证明
    题目描述一个长度为\(n\)的数组\(A\),每秒都会变成一个长度为\(n−1\)新数组\(A'\),其变化规则如下:若当前数组\(A\)的长度\(n\)为偶数,则对于新数组\(A'\)的每一个位置\(i(1≤i<n)\)来说,\(A'[i]=A[i]+A[i+1]\)若当前数组\(A\)的长度\(n\)为奇数,则对于......
  • Easy-Captche的绘画方法
    EasyCaptche功能有5个验证码类型,分别为png类型jpg类型中文类型中文jpg类型算数类型这5个对象中都会有graphicsImage()方法,其功能是将内容画出来。效果展示:绘画方法:在画板上一点一点画//以下方法,为SpecCaptcha中的out方法体privatebooleangraphicsImage(cha......
  • 久壳机房--动环监控系统你不能不知道的事
    ​​近年来,随着信息化、数字化、云计算、物联网等技术在各行业的快速发展,通信机房、动力机房、边缘计算机房、数据中心机房等蓬勃发展。而今日我们要讲的是智能机房的动环监控系统,动环监控系统又称机房动环、机房动力环境监控系统、动环监控等,是指对各机房的动力、环境、安防进......