首页 > 其他分享 >分组循环

分组循环

时间:2023-11-16 11:57:26浏览次数:32  
标签:nums int 内层 ++ 循环 分组 数组

一、适用场景

对于一个数组,要做多次判断条件相同的处理

二、核心思想

一般分为外层循环和内层循环,两个循环用于处理不同的事情

1.外层循环用于做准备工作和内层循环后的统计工作(例如求最大值)

2.内层循环用于遍历数组

时间复杂度为O(n),因为中间的变量 " i " 是一直在加,没有减小过

模板:

int n = len(nums)//首先确定数字的长度
int i = 0//定义一个循环变量

while(i  < n)//外层循环
{
        int  start = i//定义一个记录开始位置的变量

        while i < n and ...://内层循环,符合条件就继续
        i++
}

三、实际运用

1.LeetCode2760最长奇偶子数组

给你一个下标从 0 开始的整数数组 nums 和一个整数 threshold 。

请你从 nums 的子数组中找出以下标 l 开头、下标 r 结尾 (0 <= L <= R < nums.length) 且满足以下条件的 最长子数组 :

  • nums[L] % 2 == 0
  • 对于范围 [L, R - 1] 内的所有下标 i ,nums[i] % 2 != nums[i + 1] % 2
  • 对于范围 [L, R] 内的所有下标 i ,nums[i] <= threshold

以整数形式返回满足题目要求的最长子数组的长度。

分析一下,该问题需要我们去找子数组,即需要遍历,并且在遍历的时候是有条件限制的,那么这个时候我们就可以用分组循环。

对于外层循环我们只需要一个变量" i "既可,然后就是我们要看是要在内层循环判断的。

因为我们要记录一个开始的位置,那么我们就要在外层循环判断是否满足 nums[L] % 2 == 0 和 nums[i] <= threshold

然后就是内层循环,需要判断的条件为 nums[i] % 2 != nums[i + 1] % 2 和 nums[i] <= threshold 

在内层循环完之后用ans来记录不断记录最大值

        int ans = 0, n = nums.size(), i = 0;
        while(i < n){
            if(nums[i] % 2 != 0 || nums[i] > threshold)
            {
                i++;
                continue;
            }
            int start = i;//当我们找到第一个符合条件的时候就记录下来
            i++;//本题需要i++,从下一个开始判断
            while(i < n && nums[i] <= threshold && nums[i] % 2 != nums[i - 1] % 2)
            {
                i++;
            }
           // i - start表示在内层循环中找到的最大的
            ans = std::max(ans, i - start);
        }
        return ans;

参考:https://leetcode.cn/problems/longest-even-odd-subarray-with-threshold/solutions/2528771/jiao-ni-yi-ci-xing-ba-dai-ma-xie-dui-on-zuspx/

 

标签:nums,int,内层,++,循环,分组,数组
From: https://www.cnblogs.com/linx000/p/17835802.html

相关文章

  • 在forEach中使用 return false 或者 break无法跳出整个循环,并且使用break会直接报错
    执行以下程序,输出结果为()vararr=[2,1,3,5,9];varcount=0;arr.forEach((val1,val2)=>{count++;if(count%3==0){return;}console.log(val1);})A21B01C0134D2159正确答案:Darr.forEach()是......
  • 循环队列
    一、普通队列(顺序存储结构)说明:rear指向队尾元素,front指向对头元素的下一个元素。i.判断元素个数:number=rear-front;ii.判断队空:rear==frontiii.插入元素:rear++;iiii.删除元素:front++;iiiii.队满操作:rear==length-1;2.2遇到假溢出问题如严蔚敏老师数据结构书中,写道,每次插......
  • Pandas 分组聚合操作详解
    Pandas是Python中用于数据分析的重要工具,它提供了丰富的数据操作方法。在数据分析过程中,经常需要对数据进行分组聚合操作。本文将介绍Pandas中的数据分组方法以及不同的聚合操作,并结合代码示例进行说明。完整Excel数据读取数据并进行简单分组首先,我们通过Pandas读取Ex......
  • python if判断和循环判断
    if判断在写代码的时候,往往需要根据某些条件进行判断,并根据判断结果执行不同的分支代码。#单个条件a=1ifa==1:print(11111)ifa==2:print(2222)else:print(333)#多个条件,加多少个都可以ifa==1:print(11111)elifa==2:print(22222)else:pri......
  • 正则表达式中的小括号"()"。是代表分组的意思。 如果再其后面出现\1则是代表与第一个
    以下代码的执行后,str的值是:varstr="Helllloworld";str=str.replace(/(l)\1/g,'$1');AHeloworldBHelloworldCHellloworldDHelllloworld正确答案:B对于正则表达式/(l)\1/g,其中(l)是第一个分组,\1指向第一个分组,即\1重复了第一个分组的内容,所以该正则表达式......
  • mysql 人大金仓 按照日 周 月 年 分组查询
    查询每天的数据myslq:SELECTCOUNT(1)AStotal,DATE_FORMAT(created_time,'%Y-%m-%d')ASdaysFROMtable_testGROUPBYdays;金仓:SELECTCOUNT(1)AStotal,to_char(created_time,'%Y-%m-%d')ASdaysFROMtable_testGROUPBYdays;查询每周的数据mys......
  • 软件测试|MySQL HAVING分组筛选详解
    简介在MySQL数据库中,HAVING子句用于在使用GROUPBY子句对结果进行分组后,对分组后的数据进行筛选和过滤。它允许我们对分组后的结果应用聚合函数,并基于聚合函数的结果进行条件过滤,从而得到我们需要的最终结果集。本文将详细介绍HAVING子句的用法,并提供一些实际示例以帮助大......
  • 软件测试|MySQL中的GROUP BY分组查询,你会了吗?
    MySQL中的GROUPBY分组查询:详解与示例在MySQL数据库中,GROUPBY语句用于将数据按照指定的列进行分组,并对每个分组执行聚合函数操作。这就是的我们可以在查询中汇总数据并生成有意义的结果。本文将深入介绍MySQL中的GROUPBY语句,并提供示例来说明其用法。基本语法在MySQL中,GRO......
  • Java流程控制06:While循环详解
     一、while循环publicclassWhileDemo01{publicstaticvoidmain(String[]args){//输出1~100,并且求和inti=1;intsum=0;while(i!=101){System.out.println(i);sum=sum+i;i++......
  • Java中for循环每次都通过list.size、str.length、length()获取数组或者字符串的长度是
    最近看到有同事在使用for循环的时候首先会将数组或者字符串的长度赋值给一个变量;在网上查了一下说是这样可以节约资源的消耗,真实的情况又是如何?让我们看下他们的源码来分析。1.将数组的长度赋值给变量lenList<Integer>list=newArrayList<Integer>();list.add(......