给出一个数组A,找出一对 (i, j)使得A[i] <= A[j] (i < j)并且j-i最大
题目:给出一个数组A,找出一对 (i, j)使得A[i] <= A[j] (i <= j)并且j-i最大 ,若有多个这样的位置对,返回i最小的那一对。
最直接的想法就是对于每一个 i 从数组最尾端开始向前找到第一个大于等于 A[i] 的位置 j ,时间复杂度O(n^2)。
. pair<int, int> find(const vector<int> &A)
. {
. int n = A.size();
. if(n == )
. throw new invalid_argument("Array's size can't be 0!");
.
. int target_i = , target_j = ;
. int max_len = ;
. for(int i = ; i < n; ++i)
. {
. int j;
. for(j = n-; j >= i; --j)
. if(A[j] >= A[i])
. break;
. if(j-i+ > max_len)
. {
. target_i = i;
. target_j = j;
. max_len = j-i+;
. }
. }
.
. return make_pair<int, int>(target_i, target_j);
. }
我们对上述算法稍作优化。当i=0时,我们假设找到的大于A[i]的最右位置是j0,那么对于i=1时,我们根本就不需要考虑小于j0的位置,因为它们的区间长度都小于j0+1,不可能成为最优解。
. pair<int, int> find(const vector<int> &A)
. {
. int n = A.size();
. if(n == )
. throw new invalid_argument("Array's size can't be 0!");
.
. int target_i = , target_j = ;
. int max_len = ;
. for(int i = ; i < n; ++i)
. {
. int j;
. for(j = n-1; j > target_j; --j) // 此处只需检查到target_j
. if(A[j] >= A[i])
. break;
. if(j-i+ > max_len)
. {
. target_i = i;
. target_j = j;
. max_len = j-i+;
. }
. }
.
. return make_pair<int, int>(target_i, target_j);
. }
但时间复杂度仍然是O(n^2)的。我们可以继续接着上面的思路优化。其实对于位置 i 求最后一个大于等于它的位置,不需要每次都从数组尾部向前找,我们可以通过改进这个地方将时间复杂度变为O(n)。
过程是这样的,对于 i ,我们先找到 i 及其右端的最大元素的位置 j ,检查是否比当前记录的最优解更优,更新。然后考虑 j+1及其右端的最大元素位置是否大于等于A[i],若是,令 j 等于该位置,重复如上过程,若否,那么从位置i+1重新开始,但j仍然从当前位置考虑即可,原因上面已说明。这样时间复杂度就成O(n)的了。
具体请参考代码
给出一个数组A,找出一对 (i, j)使得A[i] <= A[j] (i < j)并且j-i最大的更多相关文章
- 数组中找出最小的K个数
		
题目 给出一个数组,找出K个最小的值 例如给出数组{5,2,4,3,1},给定K值3,则输出结果为{2,3,1} 程序 先给出第一个版本的程序 public static void printKNum ...
 - [原]Java面试题-输入一个整型数组,找出最大值、最小值,并交换。
		
[Date]2013-09-19 [Author]wintys (wintys@gmail.com) http://wintys.cnblogs.com [Content]: 1.面试题 输入一个整型 ...
 - 笔试题&面试题:找出一个数组中第m小的值并输出
		
题目:找出一个数组中第m小的值并输出. 代码: #include <stdio.h> int findm_min(int a[], int n, int m) //n代表数组长度,m代表找 ...
 - 用C#写一个函数,在一个数组中找出随意几个值相加等于一个值   与迭代器对比
		
算法!用C#写一个函数,在一个数组中找出随意几个值相加等于一个值比如,数组{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20} 要找出那些数相加等 ...
 - 作业帮:给定一个整数数组,找出其中两个数相加等于目标值(去重set)
		
题目描述 给定一个整数数组,找出其中两个数相加等于目标值 输入 [1,3,5,7,9,11] 10 输出 1,9 3,7 代码: import java.util.HashMap; import ja ...
 - 刷题之给定一个整数数组 nums 和一个目标值 taget,请你在该数组中找出和为目标值的那 两个 整数
		
今天下午,看了一会github,想刷个题呢,就翻出来了刷点题提高自己的实际中的解决问题的能力,在面试的过程中,我们发现,其实很多时候,面试官 给我们的题,其实也是有一定的随机性的,所以我们要多刷更多的 ...
 - CodeForces 702B Powers of Two【二分/lower_bound找多少个数/给出一个数组 求出ai + aj等于2的幂的数对个数】
		
B. Powers of Two You are given n integers a1, a2, ..., an. Find the number of pairs of indexes i, ...
 - Leetcode34--->Search for a Range(在排序数组中找出给定值出现的范围)
		
题目:给定一个排序数组,找出给定的target值出现的范围:算法复杂度要求在O(logn);如果没有找到,则返回[-1, -1]; 举例: For example,Given [5, 7, 7, 8, ...
 - Leetcode33--->Search in Rotated Sorted Array(在旋转数组中找出给定的target值的位置)
		
题目: 给定一个旋转数组,但是你不知道旋转位置,在旋转数组中找出给定target值出现的位置:你可以假设在数组中没有重复值出现 举例: (i.e., 0 1 2 4 5 6 7 might becom ...
 
随机推荐
- JVM 性能调优实战之:使用阿里开源工具 TProfiler 在海量业务代码中精确定位性能代码
			
本文是<JVM 性能调优实战之:一次系统性能瓶颈的寻找过程> 的后续篇,该篇介绍了如何使用 JDK 自身提供的工具进行 JVM 调优将 TPS 由 2.5 提升到 20 (提升了 7 倍) ...
 - codeforces 675E Trains and Statistic 线段树+贪心统计
			
分析:这个题刚看起来无从下手 但是我们可以先简化问题,首先可以固定起点i,求出i+1到n的最小距离 它可以到达的范围是[i+1,a[i]],贪心的想,我们希望换一次车可以到达的距离尽量远 即:找一个k ...
 - libpomelo的cocos2d-x客户端使用总结
			
这几天看了libpomelo的cocos2dx客户端这是个聊天室,由2个场景构成,登录场景LoginScene,聊天场景ChatScene. 一. LoginScene 客户端是以Login场景来启动 ...
 - linux中的livecd、liveDVD和其他安装方式简介
			
下载了几种不同格式的centos版本的iso文件,从而对比下各种iso文件的差别,下载的内容如下: 下载之后,分别在虚拟机中进行安装,从而查看有何区别: 1. 使用LiveCD进行安装 在选择安装介质 ...
 - LeetCode题解——String to Integer(atoi)
			
题目: 字符串转换为数字. 解法: 这道题的意思是要考虑到,如果有前置的空字符,则跳过:如果超出数字范围,则返回最大/最小整数:如果碰到第一个不能转换的字符,则返回. 代码: class Soluti ...
 - nodejs学习笔记之mongoDB
			
这两天在学习nodejs,但是发现那本书nodejs入门指南上所用的好多方法都报错. 这里主要说下数据库部分 关于注册部分:书上创建数据库那里可能要小心点,用户名不存在的时候,下面调用save的对象要 ...
 - 五指CMS 3.0 手动升级方法
 - 多元线性回归(Linear Regression with multiple variables)与最小二乘(least squat)
			
1.线性回归介绍 X指训练数据的feature,beta指待估计得参数. 详细见http://zh.wikipedia.org/wiki/%E4%B8%80%E8%88%AC%E7%BA%BF%E6% ...
 - 基于easyui的验证扩展
			
基于easyui的验证扩展 ##前言 自己做项目也有好几年的时间了,一直没有时间整理自己的代码,趁春节比较闲,把自己以前的代码整理了一篇.这是基于easyui1.2.6的一些验证扩展,2012年就开始 ...
 - J2EE开发常用开源框架技术(转)
			
1持久层:1)Hibernate这个不用介绍了,用的很频繁,用的比较多的是映射,包括继承映射和父子表映射对 于DAO在这里介绍个在它基础上开发的包bba96,目前最新版本是bba96 2.0它对Hib ...