zoukankan      html  css  js  c++  java
  • 【LEETCODE】75、第1248题 统计「优美子数组」

    package array.medium;
    
    /**
     * @Auther: xiaof
     * @Date: 2020/4/21 10:48
     * @Description:1248. 统计「优美子数组」
     * 给你一个整数数组 nums 和一个整数 k。
     * 如果某个 连续 子数组中恰好有 k 个奇数数字,我们就认为这个子数组是「优美子数组」。
     * 请返回这个数组中「优美子数组」的数目。
     * 示例 1:
     * 输入:nums = [1,1,2,1,1], k = 3
     * 输出:2
     * 解释:包含 3 个奇数的子数组是 [1,1,2,1] 和 [1,2,1,1] 。
     * 示例 2:
     * 输入:nums = [2,4,6], k = 1
     * 输出:0
     * 解释:数列中不包含任何奇数,所以不存在优美子数组。
     * 示例 3:
     * 输入:nums = [2,2,2,1,2,2,1,2,2,2], k = 2
     * 输出:16
     * 提示:
     *
     * 1 <= nums.length <= 50000
     * 1 <= nums[i] <= 10^5
     * 1 <= k <= nums.length
     *
     * 来源:力扣(LeetCode)
     * 链接:https://leetcode-cn.com/problems/count-number-of-nice-subarrays
     * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
     */
    public class NumberOfSubarrays {
    
        public int solution(int[] nums, int k) {
            int i = 0, j = 0, ki = 0, res = 0;
            while (i < nums.length && j < nums.length) {
                //判断范围,判断窗口边缘是否是瞒住条件
                if (isOdd(nums[j])) {
                    //如果j是奇数
                    ki++;
                }
                //判断窗口是否瞒住k个,并对窗口进行改变,要保证恰好有K个,多了少了都不行
                while ((j - i + 1) >= k && ki == k) {
                    res++;
                    //如果瞒住了,那么从当前j到这个串的后续所有偶数都是符合的
                    for (int x = j + 1; x < nums.length; ++x) {
                        if (!isOdd(nums[x])) {
                            res++;
                        } else break;
                    }
    //                res++;
                    //然后判断前面的窗口进行递增
                    if (isOdd(nums[i])) {
                        ki--;
                    }
                    i++;
                }
                ++j;
            }
            //去掉全集
            return res;
        }
    
        private boolean isOdd(int n) {
            //判断是否是奇数
            if ((n & 1) == 0) {
                return false;
            } else {
                return true;
            }
        }
    
    
        public int numberOfSubarrays(int[] nums, int k) {
            if (nums == null || nums.length == 0 || nums.length < k) return 0;
            // 双指针
            int left = 0, right = 0;
            int count = 0; // 连续子数组中奇数的个数
            int res = 0;
            int preEven = 0; // 记录第一个奇数前面的偶数个数
            while (right < nums.length){
                // 连续子数组中奇数个数不够
                if (count < k){
                    if (nums[right] % 2 != 0) count++;
                    right++; // 移动右侧指针
                }
                // 连续子数组中奇数个数够了,看第一个奇数前面有多少个偶数
                if (count == k) {
                    preEven = 0;
                    while (count == k){
                        res++;
                        if (nums[left] % 2 != 0) count--;
                        left++;
                        preEven++;
                    }
                } else res += preEven; // 每次遇到 right 为偶数的时候就进行累加 相当于区间前面偶数个数 * 后面偶数个数
            }
            return res;
        }
    
        public static void main(String[] args) {
            NumberOfSubarrays fuc = new NumberOfSubarrays();
            int nums1[] = {2,2,2,1,2,2,1,2,2,2}, k1 = 2;
            int nums2[] = {1,1,2,1,1}, k2 = 3;
            int nums3[] = {45627,50891,94884,11286,35337,46414,62029,20247,72789,89158,54203,79628,25920,16832,47469,80909}, k3 = 1;
    
            fuc.solution(nums3, k3);
    //        fuc.numberOfSubarrays(nums2, k2);
        }
    }
  • 相关阅读:
    文章索引
    Rancher pipeline 实现简单跟踪
    rancher 应用商店
    nginx ingress 在aks 上安装
    go countdown
    go channel pipeline 套路
    gorm使用
    华为云cce pvc 指定云硬盘云存储
    influxdb 基本概念
    Python3处理xlsx去掉含有特定字符的行
  • 原文地址:https://www.cnblogs.com/cutter-point/p/12743677.html
Copyright © 2011-2022 走看看