数组小技巧

问题一:在一个数组中找到差值最大的两个数字,要求小数在前大数在后,时间O(n)

想法:从前往后遍历的时候记录最大值和最小值,如果当前最大值在最小值的后面,更新差值的最大值

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <vector>
 4 #include <cstdio>
 5
 6 using namespace std;
 7
 8 int readint(){
 9     int x;scanf("%d",&x);return x;
10 }
11
12 int main()
13 {
14     vector<int>a;
15     int n,maxn,minn,value_maxn;
16     scanf("%d",&n);
17     for(int i=0;i<n;i++){
18         a.push_back(readint());
19     }
20     for(int i=0;i<n;i++){
21         if(i==0){
22             maxn=minn=a[i];
23             value_maxn=0;
24         }
25
26         if(a[i]<minn){
27             maxn=minn=a[i];
28         }
29         if(a[i]>maxn){
30             maxn=a[i];
31             if(maxn-minn>value_maxn)
32                 value_maxn=maxn-minn;
33         }
34     }
35     printf("%d\n",value_maxn);
36     return 0;
37 }

问题二:求和最大的子序列之和(hdu1003)

想法一:首先,考虑暴力的方法,遍历整个序列,假定所有位置都是一个开始位置,然后去求当前开始位置下,任意结束位置的序列和,比较出最大的序列和即可。这样,时间复杂度为O(n^2)

进一步考虑,假设已经得到最大和的子序列,那么之所以这个子序列不包含前面的几个或者后面几个元素的原因,就是因为前面(或者后面)连续几个元素的和是负数。这样,考虑子序列的结束位置,遍历0...n-1,假设当前位置为结束位置,那么如果以前面一个位置为结束的最大子序列和为负数时,只包含当前位置元素的子序列就是以当前位置结束的子序列的最大值;否则,以前面一个位置为结束的最大子序列和加上当前元素就是以当前位置结束的子序列的最大值。这样,按顺序遍历一遍,就可以得到以每个位置为结束位置的最大子序列的和,其中最大的就是整个序列最大子序列的和,时间复杂度O(n)。

想法二:前缀和的想法,首先求出前缀和,一段子序列的和就变成了前缀和序列中两值之差,求出最大的差值即可。就转化成了问题一:如何在O(n)的时间中求出前小后大差值最大的两个数。

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <vector>
 4 #include <cstdio>
 5
 6 using namespace std;
 7
 8 int readint(){
 9     int x;scanf("%d",&x);return x;
10 }
11
12 int main()
13 {
14     vector<int>a;
15     vector<int>sum;
16     int n,maxn,minn,value_maxn;
17     scanf("%d",&n);
18     for(int i=0;i<n;i++){
19         a.push_back(readint());
20     }
21     for(int i=0;i<n;i++){
22         if(i==0)sum.push_back(a[i]);
23         else sum.push_back(a[i]+sum[i-1]);
24     }
25     for(int i=0;i<n;i++){
26         if(i==0){
27             maxn=minn=sum[i];
28             value_maxn=0;
29         }
30
31         if(sum[i]<minn){
32             maxn=minn=sum[i];
33         }
34         if(sum[i]>maxn){
35             maxn=sum[i];
36             if(maxn-minn>value_maxn)
37                 value_maxn=maxn-minn;
38         }
39     }
40     printf("%d\n",value_maxn);
41     return 0;
42 }

问题三:求积最大的连续子段

想法:这个问题也有两种做法,1,你可以模仿问题二的第一种做法维护最大最小值。2,模仿问题二的第二个想法,维护前缀积数组。在这里不给出实现。

原文地址:https://www.cnblogs.com/wz-archer/p/10165117.html

时间: 2024-10-07 17:47:01

数组小技巧的相关文章

数组小技巧sort()

var numberArray = [3, 6, 2, 4, 1, 5, 13];//实现对该数组的大小顺序序排列,输出[1,2,3,4,5,6,13]                  var arr2 = numberArray.sort(function(a, b) {                if(a > b) {                    return 1;                } else if(a < b) {                    r

JS获取数组小技巧

有如下数组 var infoArray = strTest.split(";");            var points2;            for (var i = 0; i < infoArray.length; i++) {                var info = infoArray[i];                points2 = info + "," + points2;            }           

数组去重的两个小技巧

数组去重的两个小技巧 首先es6有提供了 Set 对象, 同java中的 Set, set中的值不可以重复. 所以对于一个数组我们可以直接采用 const duplicateArr = [2,3,4,4,4,3]; const newArray = [...new Set(duplicateArr)]; console.log(newArray); 可以采用filter函数进行过滤, 查看index 是否跟当前的index一致. 因为indexOf返回的是第一个查找的位置 const dupli

移动端样式小技巧

平时在移动端开发拼页面的过程中总会遇到一些问题,主要是各手机webview样式显示效果不一致造成的.以下总结了一些常见坑和一些小技巧,希望对看官有所帮助! 本文只针对两大手机阵营 Android和IOS 中的魅蓝metal 和 iPhone6进行样式对比. 一.line-height line-height经常用于文字居中,当然也有小伙伴会用上下padding去写.but!不管你用padding还是line-height,不同手机显示效果还是-不一样. 一般会这样写 .demo{ height:

ACM 刷题小技巧【转】

转载自URl-team ACM做题过程中的一些小技巧. 1.一般用C语言节约空间,要用C++库函数或STL时才用C++; cout.cin和printf.scanf最好不要混用. 大数据输入输出时最好不要用cin.cout,防止超时. 2.有时候int型不够用,可以用long long或__int64型(两个下划线__). 值类型表示值介于 -2^63 ( -9,223,372,036,854,775,808) 到2^63-1(+9,223,372,036,854,775,807 )之间的整数.

iOS 小技巧总结,绝对有你想要的

iOS 小技巧总结,绝对有你想要的 原文链接:http://www.jianshu.com/p/4523eafb4cd4 在这里总结一些 iOS 开发中的小技巧,能大大方便我们的开发,持续更新. —— 由 xcvxvxc分享 在这里总结一些iOS开发中的小技巧,能大大方便我们的开发,持续更新. UITableView的Group样式下顶部空白处理 在viewWillAppear里面添加如下代码: //分组列表头部空白处理 CGRect frame = myTableView.tableHeade

【前端】javascript中10常用的个小技巧总结

javascript中10常用的个小技巧总结 本文转自:http://www.cnblogs.com/libin-1/p/6756393.html 1. new Set() 可能有人知道ES6中提供了新的数据结构 Set,但是能够灵活运用的人或许不多.利用Set数据结构我们能够轻松的去重一个数组,比如: let arr = [1, 2, 2, 3]; let set = new Set(arr); let newArr = Array.from(set); // Array.from方法可以将

Day4:T1小技巧(类似于指针操作)T2搜索+小细节

Day4:其中有很多小技巧get T1 一直没有听到过像这样的小技巧的略专业名词,有点类似于指针操作,之前有碰到过很多这样的题目 每次都是以不同的形式出现,但是感觉思想还是有点接近的吧(就比如某天有一题happy,貌似也是这类型的) 这类题目第一眼总是看起来特别的不能写,其实想到了这些技巧之后很简单 感觉这也没有什么规律性或是模板可言 大概的,就是指针思想+平时积累吧 说说这一题吧 在分析正解之前,我们先说一说比较容易想到的骗分方法 设男女人数相同时ans=0,如果下一个是男->ans++,el

android 系统定制的小技巧

<转>android 系统定制的小技巧(网络收集) 1开机图片: android-logo-mask.pngandroid-logo-shine.png 这两个图片一个在上一个在下 ./out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates/classes/assets/images/android-logo-shine.png./frameworks/base/core/res/assets/image