第一行输入单个整数N作为数列的大小,第二行输入所有数列中的元素M,共N个。0 < N <= 1000000, 0 < M < 2100000000
数列的最大差值
3 1 10 5
5
#include<iostream> #include<vector> using namespace std; // //来自邹博 //设n个数最大值max,最小值min //n个数 分布 max,min共有n-1个区间 //每个区间内只需要统计最大和最小值即可 //每个区间[a,b),n个桶,最大数单独一个区间 int main() { int n; cin >> n; vector<int> a(n, 0); int max = 0, min = 2100000000; vector<int> bucket_min(n, 2100000000), bucket_max(n, 0); for (auto &i : a) { cin >> i; if (i < min)min = i; if (i > max)max = i; } if (n == 1) { cout << 0; return 0; } double delta = ((double)max - min) / (n - 1); if (delta == 0) { cout << 0; return 0; } for (auto i : a) { int index = (i - min) / delta ; if (bucket_min.at(index) >= i)bucket_min.at(index) = i; if (bucket_max.at(index) <= i)bucket_max.at(index) = i; } int max_delta = 0; int begin_1 = bucket_max[0]; for (int i = 1; i < n; i++) { if (bucket_min[i] != 2100000000 && (bucket_min[i] - begin_1 > max_delta))//这个区间有数 max_delta = bucket_min[i] - begin_1; if(bucket_max[i]!=0)begin_1 = bucket_max[i]; } cout << max_delta; }
public class LongestDistance {
public int getDis(int[] A, int n) {
// 定义两个数组, leftMin 和 rightMax, 其中 leftMin[i] 表示从 0 到 i 之间的最小值,
// rightMax[i] 表示从 n-1 到 i 之间的最大值.
// 之后利用 rightMax[i] - leftMin[i] 得到差的最大值
int[] leftMin = new int[n];
int[] rightMax = new int[n];
leftMin[0] = A[0];
rightMax[n - 1] = A[n - 1];
for (int i = 1; i < n; ++i) {
if (leftMin[i - 1] < A[i]) {
leftMin[i] = leftMin[i - 1];
} else {
leftMin[i] = A[i];
}
}
for (int i = n - 2; i >= 0; --i) {
if (rightMax[i + 1] > A[i]) {
rightMax[i] = rightMax[i + 1];
} else {
rightMax[i] = A[i];
}
}
int res = 0;
for (int i = 0; i < n; ++i) {
if (rightMax[i] - leftMin[i] > res) {
res = rightMax[i] - leftMin[i];
}
}
return res;
}
}
// 分享一个伪O(n)的算法,用map存储每个不同值,然后遍历,这里用到了map遍历时其键从小到大的特点 #include <iostream> #include <map>
using namespace std;
int main(){ int n; int max; cin >> n; map<int,int> m; int x; for(int i=0;i<n;++i){ cin >> x; ++m[x]; } map<int,int>::iterator it = m.begin(); ++it; max = 0; map<int,int>::iterator pre = m.begin(); for(;it!=m.end();++it,++pre){ if(it->first - pre->first > max) max = it->first - pre->first; } cout << max; return 0; }
//先排序,再直接开一个数组保存相邻元素差值,找最大的就行了,时间复杂度O(n),简单暴力。 //运行时间68ms,占内存1920K。感觉68ms有点长,时间复杂度大于O(n),感谢“我要offer~”的意见。 #include <iostream> #include <vector> #include <algorithm> using namespace std; int main(){ int N; while(cin>>N){ vector<int> array(N); for(int i=0;i<(int)array.size();++i){ cin>>array[i]; } sort(array.begin(),array.end()); vector<int> minu(N);//相邻元素差值 minu[0]=0; int max_minu=0; for(int i=1;i<(int)minu.size();++i){ minu[i]=array[i]-array[i-1]; max_minu=minu[i]>max_minu?minu[i]:max_minu; } cout<<max_minu<<endl; } return 0; }
import java.util.*; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); //while (in.hasNextInt()) { int n = in.nextInt(); int[] a = new int[n]; for (int i = 0; i < n; i++) if (in.hasNextInt()) a[i] = in.nextInt(); if (n == 1) { System.out.println(0); return; } Arrays.sort(a); int d = 0; for (int i = 0; i < n - 1; i++) { d = Math.max(d, a[i+1]-a[i]); } System.out.println(d); // } } }
#include <bits/stdc++.h> using namespace std; int main(){ int N; scanf("%d", &N); if(N < 0) return 0; priority_queue<int, vector<int>, greater<int>> heap; int tmp; while(~scanf("%d", &tmp)){ heap.push(tmp); } int cur = heap.top(); heap.pop(); int res = 0; while(!heap.empty()){ tmp = heap.top(); heap.pop(); res = max(res,tmp - cur); cur = tmp; } cout<<res; return 0; }
//我的想法:直接基数排序思想,牺牲空间,复杂度o(n)
#include<iostream>
#include<vector> using namespace std; int main() { int n; cin>>n; vector<int> a; int num; int max_num = 0; for(int i=0;i<n;i++) { cin>>num; if(max_num<num) { max_num = num; } a.push_back(num); } vector<bool>c; //根据输入数据的最大值开辟一个vector c.resize(max_num+1); for(int i=0;i<n;i++) { if(c[a[i]]==0) { c[a[i]] =1; } } int max =-1; int j=0; //寻找差距最大的相邻数 for(int i=2,j=1;j<=max_num&&i<=max_num;) { while(i<=max_num&&c[i]==0) { i++; } while(j<=max_num&&c[j]==0) { j++; } if(i==max_num+1||j==max_num+1) { break; } if(i-j>max) { max = i-j; } j=i; i++; } cout<<max; return 0; }
#include <iostream> #include <vector> #include <map> #include <set> #include <cstring> #include <math.h> #include <algorithm> using namespace std; int main(int argc, char **argv) { int cnt; while (cin>>cnt) { vector<int> nums(cnt); for (int i = 0; i < cnt; i++) cin >> nums[i]; sort(nums.begin(), nums.end()); int smax = -9999, sub = 0; for (int i = 0; i < nums.size() - 1; i++) { sub = nums[i + 1] - nums[i]; smax = sub > smax ? sub : smax; } cout << "" << smax << endl; } return 0; }
}
import sys n = int(sys.stdin.readline().strip()) def maxnum(initlist): li = [] n = len(initlist) for i in range(n): num = initlist[i] - initlist[i-1] li.append(num) return max(li) initlist = list(map(int, sys.stdin.readline().strip().split())) initlist = sorted(initlist) result = maxnum(initlist) print result
//为什么只通过了66.67%!!! 。。。
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
while(in.hasNext()){
int datanum = in.nextInt();
int[] data = new int[datanum];
for (int i = 0; i < data.length; i++) {
data[i] = in.nextInt();
}
int maxDis = findMaxDisfromArray(data,datanum);
System.out.println(maxDis);
}
}
private static int findMaxDisfromArray(int[] data ,int datanum) {
if (data == null || data.length < 2) {
return 0;
}
int len = data.length;
int min = Integer.MAX_VALUE;
int max = Integer.MIN_VALUE;
for (int i = 0; i < len; i++) {
min = Math.min(min, data[i]);
max = Math.max(max, data[i]);
}
if (min == max) {
return 0;
}
boolean[] hasNum = new boolean[datanum + 1];
int[] maxs = new int[datanum + 1];
int[] mins = new int[datanum + 1];
int bid = 0;
for (int i = 0; i < datanum; i++) {
bid = bucket(data[i], datanum, min, max); // 算出桶号
mins[bid] = hasNum[bid] ? Math.min(mins[bid], data[i]) : data[i];
maxs[bid] = hasNum[bid] ? Math.max(maxs[bid], data[i]) : data[i];
hasNum[bid] = true;
}
int res = 0;
int lastMax = 0;
int i = 0;
while (i <= datanum) {
if (hasNum[i++]) { // 找到第一个不空的桶
lastMax = maxs[i - 1];
break;
}
}
for (; i <= datanum; i++) {
if (hasNum[i]) {
res = Math.max(res, mins[i] - lastMax);
lastMax = maxs[i];
}
}
return res;
}
public static int bucket(long num, long len, long min, long max) {
return (int) ((num - min) * len / (max - min));
}
}
//桶排序时间复杂度O(n)
#include <iostream>
#include <vector>
using namespace std;
struct Node{
int min;
int max;
Node(int _min=2100000000, int _max=-1):min(_min), max(_max){}
};
int main(){
int n;
while (cin >> n){
vector<int> arr(n);
int tmp;
int min = 2100000000;
int max = -1;
int i;
for (i = 0; i<n; i++){
cin >> tmp;
arr[i] = tmp;
min = tmp < min ? tmp : min;
max = tmp > max ? tmp : max;
}
int step = (max - min+1)/n ;
if ((n*step - (max - min + 1) != 0))
step++;
vector<Node> buck(n);
for (i = 0; i<n; i++){
int index = (arr[i] - min)/step;
buck[index].min = arr[i] < buck[index].min ? arr[i] : buck[index].min;
buck[index].max = arr[i] > buck[index].max ? arr[i] : buck[index].max;
}
i = 0;
while (i<n && buck[i].max == -1){
++i;
}
int ans = 0;
int last = buck[i++].max;
while (i<n){
while (i<n && buck[i].min == 2100000000)
i++;
ans = buck[i].min - last > ans ? buck[i].min - last : ans;
last = buck[i].max;
i++;
}
cout << ans << endl;
}
return 0;
}
import java.util.*; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNext()) { int n = in.nextInt(); int[] data = new int[n]; for (int i = 0; i < n; i++) data[i] = in.nextInt(); System.out.println(MaxDis(data, n)); } in.close(); } public static int MaxDis(int[] A, int n) { int max = Integer.MIN_VALUE, min = Integer.MAX_VALUE; for (int i = 0; i < n; i++) { max = Math.max(A[i], max); min = Math.min(A[i], min); } int d = (max - min) / n; int[] Max = new int[n + 1]; int[] Min = new int[n + 1]; Max[0] = Min[0] = min; Max[n] = Min[n] = max; for (int i = 0; i < n; i++) { if (A[i] != max && A[i] != min) { Max[(A[i] - min) / d] = Math.max(Max[(A[i] - min) / d], A[i]); if (Min[(A[i] - min) / d] == 0) Min[(A[i] - min) / d] = A[i]; else Min[(A[i] - min) / d] = Math.min(Min[(A[i] - min) / d], A[i]); } } int count = 0; int res = 0; int start = 1; for (int i = 1; i < n; i++) { count = 0; while (Max[i] == 0) { count++; i++; start = i; } res = Math.max(count, res); } return Min[start] - Max[start - res - 1]; } }
谁能告诉我总说只能测试一个用例什么鬼,我明明有while(in.hasNext())的啊