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

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

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);
        }
    }
}


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

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

                             

相关文章
|
7月前
|
算法 C++
【洛谷 P1223】排队接水(贪心算法+结构体排序)
该问题要求安排$n$个人的排队顺序以最小化平均等待时间。每个人接水需时$T_i$,解决方案是让接水时间短的人优先。给定$n\leq1000$和$t_i\leq10^6$,代码示例使用C++实现,通过排序使时间从小到大排列,然后计算平均等待时间。样例输入为10个人的时间数组,输出为优化后的排队顺序及平均等待时间(291.90)。
65 0
|
5月前
|
算法
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
|
2月前
|
搜索推荐 算法 C语言
【排序算法】八大排序(下)(c语言实现)(附源码)
本文继续学习并实现了八大排序算法中的后四种:堆排序、快速排序、归并排序和计数排序。详细介绍了每种排序算法的原理、步骤和代码实现,并通过测试数据展示了它们的性能表现。堆排序利用堆的特性进行排序,快速排序通过递归和多种划分方法实现高效排序,归并排序通过分治法将问题分解后再合并,计数排序则通过统计每个元素的出现次数实现非比较排序。最后,文章还对比了这些排序算法在处理一百万个整形数据时的运行时间,帮助读者了解不同算法的优劣。
163 7
|
2月前
|
搜索推荐 算法 C语言
【排序算法】八大排序(上)(c语言实现)(附源码)
本文介绍了四种常见的排序算法:冒泡排序、选择排序、插入排序和希尔排序。通过具体的代码实现和测试数据,详细解释了每种算法的工作原理和性能特点。冒泡排序通过不断交换相邻元素来排序,选择排序通过选择最小元素进行交换,插入排序通过逐步插入元素到已排序部分,而希尔排序则是插入排序的改进版,通过预排序使数据更接近有序,从而提高效率。文章最后总结了这四种算法的空间和时间复杂度,以及它们的稳定性。
135 8
|
3月前
|
搜索推荐 Shell
解析排序算法:十大排序方法的工作原理与性能比较
解析排序算法:十大排序方法的工作原理与性能比较
105 9
|
3月前
|
算法 搜索推荐 Java
数据结构与算法学习十三:基数排序,以空间换时间的稳定式排序,速度很快。
基数排序是一种稳定的排序算法,通过将数字按位数切割并分配到不同的桶中,以空间换时间的方式实现快速排序,但占用内存较大,不适合含有负数的数组。
48 0
数据结构与算法学习十三:基数排序,以空间换时间的稳定式排序,速度很快。
|
3月前
|
算法
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
38 0
|
3月前
|
存储 算法 搜索推荐
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
87 0
|
5月前
|
搜索推荐 算法 Java
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
该博客文章通过UML类图和Java源码示例,展示了如何使用适配器模式将QuickSort类和BinarySearch类的排序和查找功能适配到DataOperation接口中,实现算法的解耦和复用。
59 1
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
|
5月前
|
算法 搜索推荐 Java
算法实战:手写归并排序,让复杂排序变简单!
归并排序是一种基于“分治法”的经典算法,通过递归分割和合并数组,实现O(n log n)的高效排序。本文将通过Java手写代码,详细讲解归并排序的原理及实现,帮助你快速掌握这一实用算法。
56 0