算法 求一个数组的最长递减子序列 C

本文介绍了如何使用C语言实现寻找一个数组的最长递减子序列的算法,内容适合零基础读者,旨在通俗易懂。同时鼓励读者分享知识,促进技术交流。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

//****************************************************************************************************////  求一个数组的最长递减子序列 - C++ - by Chimomo////  题目: 求一个数组的最长递减子序列,比如{8, 14, 6, 2, 8, 14, 3, 2, 7, 4, 7, 2, 8, 101, 23, 6, 1, 2, 1, 1}的最长递减子序列为{14,8,3,2,1}。////  Answer: Scan from left to right, maintain a decreasing sequence. For each number, binary search in the decreasing sequence to see whether it can be substituted.////****************************************************************************************************#include <iostream>#include <cassert>#include <stack>using namespace std ;int BinarySearch(int *A, int nTarget, int nLen);// Find the longest decreasing sequence in array A of length nLen.void FindLongestDecreasingSequence(int *A, int nLen)int *index = new int[nLen]; int *LDS = new int[nLen]; index[0] = A[0]; LDS[0] = 1int indexLen = 1for (int i = 1; i < nLen; i++) {  int pos = BinarySearch(index, A[i], indexLen);  index[pos] = A[i];  LDS[i] = pos + 1;  if(pos >= indexLen)  {   indexLen++;  } } int ResultLen = indexLen; for (int i = nLen; i >= 0; i--) {  if(LDS[i] == ResultLen)  {    index[ResultLen - 1] = A[i];   ResultLen--;  }   } for (int i = 0; i < indexLen; i++) {  cout << index[i] << " "; } delete [] index;}// Binary search nTarget in array A of length nLen.int BinarySearch(int *A, int nTarget, int nLen){ assert(A != NULL && nLen > 0); int start = 0int end = nLen - 1while (start <= end) {  int mid = (start + end) / 2;  if(nTarget > A[mid])  {   end=mid-1;  }  else if(nTarget<A[mid])  {   start=mid+1;  }  else  {   return mid;  } } return start;}int main()int A[] = {8, 14, 6, 2, 8, 14, 3, 2, 7, 4, 7, 2, 8, 101, 23, 6, 1, 2, 1, 1}; int nLen = sizeof(A) / sizeof(int); FindLongestDecreasingSequence(A, nLen); return 0;}// Output:/*14 8 7 6 2 1*/
           

给我老师的人工智能教程打call!http://blog.youkuaiyun.com/jiangjunshow
这里写图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值