利用问题的本身与序列的特新,使用两个下标i, j对序列进行扫描(可以同向扫描,也可以反向扫描),以较低的时间复杂度解决问题,一般是O(n)

例1:给定一个递增的正整数序列和一个正整数M,求序列中的两个不同位置的数a和b,使得它们的和恰好为M,输出所有满足条件的方案。加入给定序列{ 1,2,3,4,5,6 }与正整数M = 8,就存在2 + 6 = 8与3 + 5 = 8成立。

暴力解法:时间复杂度为O(n ^ 2),两层两串层循环枚举。

分析:
令下标i的初值为0,下标j的初值为n-1,前者向右移动,后者向左移动,一直到i>=j成立
1.当a[i]+a[j]==M符合条件时,剩余的方案只有可能在[i+1,j-1]中出现于是令i++;j–;
2.当a[i]+[j]<M时,剩余的方案只可能在[i+1,j]中出现,于是让i++;
3.当a[i]+a[j]>M时,剩余的方案只可能在[i,j-1]中出现,j–;
代码实现如下:

while (i >= j) {
if (a[i] + a[j] == M) {
i++;
j--;
}
else if (a[i] + [j] < M) {
i++;
}
else j--;
}

此算法的复杂度仅为O(n).

例2:两个递增序列A,B合并成为一个递增序列C,同时考虑两个序列,对两个序列进行比较,再选择填入序列C
代码实现:

int merge(int A[], int B[], int C[], int n, int m) {//n为A[]中元素个数,m为B[]中元素个数。
int i = 0, j = 0, index = 0;
while (i < n && j < m) {
if (A[i] <= B[j]) {
C[index++] = A[i++];
}
else if{
C[index++] = B[j++];
}
while (i < n){
C[index++] = A[i++];
}
while (j < m){
C[index++] = B[j++];
}
return index;
}
}

随机推荐

  1. gitLab的使用 和 git 、 github、gitlab的区别

    一.git . github.gitlab的区别  (百度相关内容得到的理解) ​ ​ 二.git最基本作用:版本控制 ​ 三.有集成了git的GIT安装包 github和gitlab都使用git该版 ...

  2. MapReduce原理及简单实现

    MapReduce是Google在2004年发表的论文<MapReduce: Simplified Data Processing on Large Clusters>中提出的一个用于分布 ...

  3. redux-devtools-extend

    如果不打算用redux-thunk import { createStore, compose} from 'redux'; import reducer from './reducer' const ...

  4. Java进阶专题(二十六) 数据库原理研究与优化

    前言 在一个大数据量的系统中,这些数据的存储.处理.搜索是一个非常棘手的问题. 比如存储问题:单台服务器的存储能力及数据处理能力都是有限的, 因此需要增加服务器, 搭建集群来存储海量数据. 读写性能问 ...

  5. ffmpeg:为视频添加静态水印

    在ffmpeg中,添加水印需要用overlay滤镜,这是一个复杂滤镜,因为它需要两个输入,默认第一个输入是主画面,第二输入为水印,先执行一个简单的看看. 下面有两个文件,一个是可爱的大雄兔,一个是可爱 ...

  6. cobra-强大的CLI应用程序库

    cobra介绍 Cobra是一个用于创建强大的现代CLI应用程序的库,也是一个用于生成应用程序和命令文件的程序. Cobra用于许多Go项目,如Kubernetes.Hugo和Github CLI等. ...

  7. WPF MVVM实例三

    在没给大家讲解wpf mwm示例之前先给大家简单说下MVVM理论知识: WPF技术的主要特点是数据驱动UI,所以在使用WPF技术开发的过程中是以数据为核心的,WPF提供了数据绑定机制,当数据发生变化时 ...

  8. Kubernetes中分布式存储Rook-Ceph的使用:一个ASP.NET Core MVC的案例

    在<Kubernetes中分布式存储Rook-Ceph部署快速演练>文章中,我快速介绍了Kubernetes中分布式存储Rook-Ceph的部署过程,这里介绍如何在部署于Kubernete ...

  9. Gradle 差异化构建

    Compile 默认的依赖方式,任何情况下都会依赖. Provided 只提供编译时依赖,打包时不会添加进去. Apk 只在打包Apk包时依赖,这个应该是比较少用到的. TestCompile 只在测 ...

  10. 迭代器 (Iterator) 和 生成器 (Generator)

    其他章节请看: es6 快速入门 系列 迭代器 (Iterator) 和 生成器 (Generator) 试图解决的问题 let colors = ['red', 'blue', 'green', ' ...