算法强化每日一题--排序子序列

简介: 算法强化每日一题--排序子序列

hello啊,今天继续为大家带来算法强化相关的题目,是一道关于排序子序列的题目,让我们一起来消灭它吧!😎😎😎


链接:排序子序列_牛客笔试题_牛客网

来源:牛客网


牛牛定义排序子序列为一个数组中一段连续的子序列,并且这段子序列是非递增或者非递减排序的。牛牛有一个长度为n的整数数组A,他现在有一个任务是把数组A分为若干段排序子序列,牛牛想知道他最少可以把这个数组分为几段排序子序列.

如样例所示,牛牛可以把数组A划分为[1,2,3]和[2,2,1]两个排序子序列,至少需要划分为2个排序子序列,所以输出2


输入描述:


输入的第一行为一个正整数n(1 ≤ n ≤ 10^5)


第二行包括n个整数A_i(1 ≤ A_i ≤ 10^9),表示数组A的每个数字。

输出描述:


输出一个整数表示牛牛可以将A最少划分为多少段排序子序列

示例1


输入

6

1 2 3 2 2 1

输出

2

首先我们认识一下非递增和非递减序列


非递增:一组数据总体来说是升序排序,但是中间有相等的数字,比如: 1 2 3 4 4 5 6


非递减:一组数据总体来说是降序排序,但是中间有相等的数字比如: 7 6 5 4 3 3 2 1


现在来分析题目中的例子


1 2 3 2 2 1


1 2 3是一组,2 2 1是一组


定义一个计数器count


思路:

分为三种情况

1.当i下标的值<i+1下标的值,i往后走,不满足此条件,说明这就是一组,count++,i++,进行下一组

2.当i下标的值=i+1下标的值,i++即可

3.当i下标的值<i+1下标的值,i往后走,不满足此条件,说明这就是一组,count++,i++,进行下一组


注意!!!

d7e3952a0a224b53b3e88d3b81b898f8.png

但是现在有一个情况,当比较到最后的1,i+1就越界了,没有值和它再比较了,我们可以采用多浪费一个空间的做法,在创建数组的时候长度变成n+1,这样就算最后的1和后面的数字比较,那就是和未初始化的数值比较,(未初始化,默认为0,),这也就是最后一组数据了,因为题目要求数组必须放大于等于1的正整数


看看代码


public class Main {
    public static void main(String[] args) {
        //先处理输入
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] array = new int[n + 1];
        for (int i = 0; i < n; i++) {
            array[i] = scanner.nextInt();
        }
        //定义下标
        int i = 0;
        int count = 0;
        //分三种情况
        while (i < n) {
            if (array[i] < array[i + 1]) {
                while (i < n && array[i] < array[i + 1]) {
                    i++;
                }
                count++;
                i++;
            } else if (i < n && array[i] == array[i + 1]) {
                i++;
            } else {
                while (i < n && array[i] > array[i + 1]) {
                    i++;
                }
                count++;
                i++;
            }
            System.out.println(count);
        }
    }
}


真好,又活过一天啊,加油,每天坚持,我们是最棒的

完结散花🌸🌸🌸🌸🌸🌸🌸🌸🌸🌸🌸🌸🌸🌸🌸🌸🌸🌸🌸🌸🌸🌸🌸🌸🌸

                             

相关文章
|
24天前
|
传感器 并行计算 算法
【无人机编队】基于非支配排序遗传算法II NSGA-II高效可行的无人机离线集群仿真研究(Matlab代码实现)
【无人机编队】基于非支配排序遗传算法II NSGA-II高效可行的无人机离线集群仿真研究(Matlab代码实现)
105 3
|
6月前
|
JavaScript 前端开发 算法
JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)
Array.sort() 是一个功能强大的方法,通过自定义的比较函数,可以处理各种复杂的排序逻辑。无论是简单的数字排序,还是多字段、嵌套对象、分组排序等高级应用,Array.sort() 都能胜任。同时,通过性能优化技巧(如映射排序)和结合其他数组方法(如 reduce),Array.sort() 可以用来实现高效的数据处理逻辑。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
6月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
算法
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
135 0
|
10月前
|
搜索推荐 算法 C语言
【排序算法】八大排序(下)(c语言实现)(附源码)
本文继续学习并实现了八大排序算法中的后四种:堆排序、快速排序、归并排序和计数排序。详细介绍了每种排序算法的原理、步骤和代码实现,并通过测试数据展示了它们的性能表现。堆排序利用堆的特性进行排序,快速排序通过递归和多种划分方法实现高效排序,归并排序通过分治法将问题分解后再合并,计数排序则通过统计每个元素的出现次数实现非比较排序。最后,文章还对比了这些排序算法在处理一百万个整形数据时的运行时间,帮助读者了解不同算法的优劣。
344 7
|
10月前
|
搜索推荐 算法 C语言
【排序算法】八大排序(上)(c语言实现)(附源码)
本文介绍了四种常见的排序算法:冒泡排序、选择排序、插入排序和希尔排序。通过具体的代码实现和测试数据,详细解释了每种算法的工作原理和性能特点。冒泡排序通过不断交换相邻元素来排序,选择排序通过选择最小元素进行交换,插入排序通过逐步插入元素到已排序部分,而希尔排序则是插入排序的改进版,通过预排序使数据更接近有序,从而提高效率。文章最后总结了这四种算法的空间和时间复杂度,以及它们的稳定性。
389 8
|
11月前
|
搜索推荐 Shell
解析排序算法:十大排序方法的工作原理与性能比较
解析排序算法:十大排序方法的工作原理与性能比较
327 9
|
11月前
|
算法 搜索推荐 Java
数据结构与算法学习十三:基数排序,以空间换时间的稳定式排序,速度很快。
基数排序是一种稳定的排序算法,通过将数字按位数切割并分配到不同的桶中,以空间换时间的方式实现快速排序,但占用内存较大,不适合含有负数的数组。
164 0
数据结构与算法学习十三:基数排序,以空间换时间的稳定式排序,速度很快。
|
搜索推荐 算法 Java
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
该博客文章通过UML类图和Java源码示例,展示了如何使用适配器模式将QuickSort类和BinarySearch类的排序和查找功能适配到DataOperation接口中,实现算法的解耦和复用。
170 1
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
|
11月前
|
算法
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
115 0

热门文章

最新文章