数组排序最小复杂度_进行排序的最小缺失数

数组排序最小复杂度

Problem statement:

问题陈述:

Given an array of n integers. Find the minimum number of elements from the array to remove or delete so that when the remaining elements are placed in the same sequence order form a sorted sequence.

给定n个整数数组。 从数组中查找要删除或删除的最小元素数,以便在其余元素以相同顺序放置时形成排序的序列。

Input:

输入:

First line contains size N.
Next line contains N input elements for the array

第一行包含大小N。
下一行包含该数组的N个输入元素

Output:

输出:

Output the minimum number of deletions to make a sorted sequence.

输出删除的最小数量以构成排序序列。

Constraints:

限制条件:

1<= N <=1000
1<= A[i ] <=1000

Example:

例:

Input:
5
5 8 5 5 4
Output:
1
Explanation:
The longest increasing subsequence is: (not strictly increasing)
5, 8 or 5,5
So we need to remove minimum three characters
The longest decreasing subsequence is: (not strictly increasing)
8 5 5 4
So we need to remove minimum one character
Thus the final output is 1
And the sorted sequence is the decreasing one
8 5 5 4 

Solution Approach:

解决方法:

So, for the sequence to be sorted we need to check for both the longest increasing and decreasing subsequence.

因此,对于要排序的序列,我们需要检查最长的递增和递减的子序列。

Let,

让,

Longest increasing subsequence be known as LIS and Longest decreasing subsequence is LDS

最长的递增子序列称为LIS,最长的递减子序列为LDS

So minimum elements to be deleted= array length- maximum(LIS, LDS)

因此要删除的最小元素=数组长度-最大(LIS,LDS)

Intuitively, the minimum value of maximum(LIS, LDS) would be 1 as each element represents the primitive sequence which is either increasing or decreasing one.

直观地, 最大值(LIS,LDS)的最小值为1,因为每个元素代表原始序列,原始序列要么递增要么递减。

So, the base value is 1.

因此,基准值为1。

Now,

现在,

Lis(i)=longest increasing subsequence starting from index 0 to index i
Lds(i)=longest decreasing subsequence starting from index 0 to index i 

So,

所以,

To compute LIS(i), LDS(i) the recursion function is,

为了计算LIS(i),LDS(i) ,递归函数为

Minimum number of deletions to make a sorted sequence

As, the base value is 1, for every index i, Lis(i), Lds(i) is at least 1.

这样,对于每个索引i ,基值是1, Lis(i)Lds(i)至少为1。

1)  Create two DP array, Lis[n],Lds[n]
2)  Initialize both the DP array with 1.
for i=0 to n-1
Lis[i]=1,Lds[i]=1;
3)  Now, to compute the Lis[i],Lds[i]
for index  i=1 to n-1         
for previous index j=0 to i-1
//if (arr[i],arr[j]) is inceasing sequence
if(lis[i]<lis[j]+1 &&a[i]≥a[j])
lis[i]=lis[j]+1;
//if (arr[i],arr[j]) is deceasing sequence
if(lds[i]<lds[j]+1 &&a[i]≤a[j])
lds[i]=lds[j]+1;
end for
end for 

Now, Minimum elements to be deleted =

现在,要删除的最少元素=

n-maximum(maximum value in (lds),maximum value in (lis))

To go through detailed explanation on LIS go through previous article on LIS: Longest Increasing Subsequence

要详细了解LIS,请阅读上一篇有关LIS: 最长递增子序列的文章。

LDS is quite similar like LIS, follow the recursion for LDS to understand this too.

LDS与LIS十分相似,也遵循LDS的递归来理解这一点。

C++ Implementation:

C ++实现:

#include <bits/stdc++.h>
using namespace std;
int LIDS(vector<int> arr, int n)
{
int LIS[n], LDS[n];
for (int i = 0; i < n; i++)
LIS[i] = 1;
for (int i = 0; i < n; i++)
LDS[i] = 1;
int maxi = INT_MIN, maxd = INT_MIN;
for (int i = 1; i < n; i++) {
for (int j = 0; j < i; j++) {
// for longest increasing sequence
if (arr[i] >= arr[j] && LIS[i] < LIS[j] + 1)
LIS[i] = LIS[j] + 1;
// for longest decreasing sequence
if (arr[i] <= arr[j] && LDS[i] < LDS[j] + 1)
LDS[i] = LDS[j] + 1;
}
//find maximum longest s orted sequence
if (LIS[i] > maxi)
maxi = LIS[i];
if (LDS[i] > maxd)
maxd = LDS[i];
}
return std::max(maxi, maxd);
}
int main()
{
int t, n, item;
cout << "Enter n:\n";
scanf("%d", &n);
cout << "Enter the array\n";
vector<int> a;
for (int j = 0; j < n; j++) {
scanf("%d", &item);
a.push_back(item);
}
cout << "Minimum elements needed to be deleted to create sorted sequence: " << n - LIDS(a, n) << endl;
return 0;
}

Output:

输出:

Enter n:
5
Enter the array
5 8 5 5 4
Minimum elements needed to be deleted to create sorted sequence: 1

翻译自: https://www.includehelp.com/icp/minimum-number-of-deletions-to-make-a-sorted-sequence.aspx

数组排序最小复杂度

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/379882.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

轻松掌握Windows窗体间的数据交互(转载)

轻松掌握Windows窗体间的数据交互作者&#xff1a;郑佐日期&#xff1a;2004-04-05Windows 窗体是用于 Microsoft Windows 应用程序开发的、基于 .NET Framework 的新平台。此框架提供一个有条理的、面向对象的、可扩展的类集&#xff0c;它使您得以开发丰富的 Windows 应用程序…

python免杀技术---shellcode的加载与执行

0x01 生成shellcode 首先通过下列命令生成一个shellcode&#xff0c;使用msfvenom -p选项来指定paylaod&#xff0c;这里选用windows/x64、exec模块接收的参数。使用calc.exe执行弹出计算器的操作。-f选项用来执行生成的shellcdoe的编译语言。 msfvenom -p windows/x64/exec …

Qt中QTableWidget用法总结

QTableWidget是QT程序中常用的显示数据表格的空间&#xff0c;很类似于VC、C#中的DataGrid。说到QTableWidget&#xff0c;就必须讲一下它跟QTabelView的区别了。QTableWidget是QTableView的子类&#xff0c;主要的区别是QTableView可以使用自定义的数据模型来显示内容(也就是先…

[转]软件架构师书单

"其实中国程序员&#xff0c;现在最需要的是一张安静的书桌。"&#xff0c;的确&#xff0c;中国架构师大多缺乏系统的基础知识&#xff0c;与其自欺欺人的宣扬"读书无用&#xff0c;重在实践变通&#xff0c;修身立命哲学书更重要"&#xff0c;把大好时间…

python免杀技术---复现+改进----1

0x01 复现 复现文章&#xff1a;https://mp.weixin.qq.com/s?__bizMzI3MzUwMTQwNg&mid2247484733&idx2&sn5b8f439c2998ce089eb44541d2da7a15&chksmeb231%E2%80%A6 首先用cobaltstruke生成一个python的payload脚本 然后复制里面的payload进行Base64编码&…

python安全攻防---信息收集---IP查询

IP查询是通过当前所获得的URL去查询对应IP地址的过程&#xff0c;可应用Socket库函数中的gethostbyname()获取域名所对用的IP值 程序如下&#xff1a; # -*- coding:utf-8 -*- IP查询import socket ip socket.gethostbyname(www.baidu.com) print(ip)运行结果&#xff1a; …

智能课程表Android版-学年学期星期的实现

上次我们实现了日期和时间的动态显示&#xff0c;这次我们来实现学年&#xff0c;学期&#xff0c;周次的显示&#xff0c;如图: 首先是学年学期的显示&#xff1a; Calendar cCalendar.getInstance(); int yearc.get(Calendar.YEAR); int monthc.get(Calendar.MONTH)1;//Calen…

python安全攻防---信息收集---whois查询

whois是用来查询域名的IP以及所有者信息的传输协议。简单地说&#xff0c;whois就是一个数据库&#xff0c;用来查询域名是否以及被注册&#xff0c;以及注册域名的详细信息&#xff08;如域名所有人、域名注册商等&#xff09;。 使用whois查询&#xff0c;首先通过pip安装py…

百度面试题:从输入url到显示网页,后台发生了什么?

参考http://igoro.com/archive/what-really-happens-when-you-navigate-to-a-url/ http://www.cnblogs.com/wenanry/archive/2010/02/25/1673368.html 原文:http://igoro.com/archive/what-really-happens-when-you-navigate-to-a-url/ 作为一个软件开发者&#xff0c;你一定会…

python安全攻防---爬虫基础---get和post提交数据

get提交数据1 get提交的数据就附在提交给服务器的url之后&#xff0c;以&#xff1f;开头参数之间以&隔开&#xff0c;例如/admin/user/123456.aspx?name123&id123 案例&#xff1a;写个脚本&#xff0c;在sogou自动搜索周杰伦&#xff0c;并将搜索页面的数据获取 程…

python安全攻防---爬虫基础--re解析数据

0x01 re基础 使用re模块&#xff0c;必须先导入re模块 import refindall()&#xff1a;匹配所有符合正则的内容&#xff0c;返回的是一个列表 import restr "我的电话&#xff1a;10086&#xff0c;女朋友电话&#xff1a;11011" list re.findall(\d,str) print…

python安全攻防---爬虫基础---BeautifulSoup解析

0x01 基础 使用bs4首先要安装&#xff0c;安装后导入 import bs4bs对象有两个方法&#xff0c;一个是find&#xff0c;另一个是find_all find&#xff08;标签名&#xff0c;属性值&#xff09;&#xff1a;只返回一个&#xff0c;返回也是bs对象&#xff0c;可以继续用find…

Java——Socket通信原理

* Socket通信原理图解* A:Socket(中文翻译为&#xff1a;电源插座)套接字概述* 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识套接字* 通信的两端都有Socket(两端都是电源插座&#xff0c;中间是啥&#xff1f;不就是电线啦&#xff0c;电…

python安全攻防---scapy基础---计算机网络各层协议

网络层次划分 比较常用的是TCP/IP五层协议。 0x01应用层 应用层是网络应用程序以及它们的应用层协议存留的地方。应用层协议和应用程序直接挂钩 DHCP(Dynamic Host Configuration Protocol)动态主机分配协议&#xff0c;使用 UDP 协议工作&#xff0c;主要有两个用途&#xf…

Java——UPD输出及优化再优化

* UPD传输不区分客户端跟服务端&#xff0c;* 这里用Send和Receive这两个方法决定谁发谁收 * 1.发送Send * 创建DatagramSocket,随机端口号* 创建DatagramPacket,指定数据、长度、地址、端口* 创建DatagramSocket发送DatagramPacket* 关闭DatagramSocket 代码如下&…

python安全攻防---信息收集---ICMP主机探测 以及optionparser的使用

0x01 基础概念 ICMP&#xff08;Internet control Message Protocal&#xff09;Internet报文协议&#xff0c;是TCP/IP的一种子协议&#xff0c;属于网络层协议&#xff0c;其目的是用于在IP主机、路由器之间传递控制信息 0x02 程序 程序 # -*- coding:utf-8 -*- from sca…

第一章 基础知识---1.4Crack小实验--复现

0x01 程序及其编译环境 程序如下&#xff0c;功能&#xff1a;我们必须输入正确的密码1234567才能得到密码验证的确认&#xff0c;跳出循环。否则程序提示密码错误再次输入。 #include <stdio.h>#define PASSWORD "1234567"int verify_password(char* passwo…

.net中调用exchange服务器发邮件

普通的邮件, 用System.Net.Mail 类 或 System.Web.Mail 类 处理即可, 但是Exchange Server 环境下, 这两个类起不了作用-------至少目前我看到的情况如此. 整个过程如下: 1. 先添加COM 引用 "Microsoft CDO for Windows 2000 Library" .2. 发送邮件的代码: CDO.Messa…

端口复用和重映射--STM32F103

什么是端口复用&#xff1f; STM32中有很多内置外设&#xff0c;这些外设的引脚都是与GPIO复用的&#xff0c;什么时候复用呢&#xff1f;就是当一个GPIO作为内置外设引脚使用时&#xff0c;就叫做复用。比如串口1的发送接收引脚是PA9&#xff0c;PA10&#xff0c;当PA9&#…

[转]Ubuntu远程桌面登陆

原文地址&#xff1a;http://www.cnblogs.com/xdzone/archive/2011/03/10/1979644.html 1.xp下默认的远程桌面协议是rdp&#xff0c;默认端口3389&#xff0c;而ubuntu用的时vnc&#xff1a;默认端口5900 2.首先被访问的主机&#xff08;windows/linux&#xff09;都要设置为允…