java - 找到对 (i,j) 使得 i
给定一个未排序的数组 - arr 找到一对 arr[i] 和 arr[j] 使得
arr[i] < arr[j] & i<j
and(arr[i] + arr[j])
是最大的。
预期时间复杂度——O(n)
问题描述
给定一个未排序的数组 - arr 找到一对 arr[i] 和 arr[j] 使得
arr[i] < arr[j] & i<j
and(arr[i] + arr[j])
是最大的。
预期时间复杂度——O(n)
对于数组a = {4, 1, 3, 2, 5, 3}
pair is (4, 5).
这是我尝试过的代码..
void findPair(int[] a){
int n = a.length;
int max = a[0];
int secondMax = Integer.MIN_VALUE;
for(int i=1; i<n; i++){
if(a[i]>max){
secondMax = max;
max = a[i];
}
}
if(secondMax == Integer.MIN_VALUE){
System.out.println("-1 -1");
}
else{
System.out.println(secondMax+" "+max);
}
}
这是不可能的,你会得到下面的编译时错误。
无法从类型中对非静态方法示例(字符串)进行静态引用
这里(示例)在非静态区域中,主要方法是静态的。
解决方案
这是使用堆栈的解决方案。这个想法是堆栈始终包含一个降序,这样对于您查看的每个数字,它都可以与堆栈中低于它的最大数字配对。
使用时将数字弹出是安全的,因为例如,如果您有一个 6 并且堆栈的顶部是 3,则无需保留 3 以防它可以与更大的数字配对;如果以后有 7,您将等待将其与 6 而不是 3 配对。
public void solution(int[] arr) {
Stack<Integer> stack = new Stack<>();
int bestX = -1, bestY = -1, bestSum = -1;
for(int y : arr) {
while(!stack.isEmpty() && stack.peek() < y) {
int x = stack.pop();
if(x + y > bestSum) { bestX = x; bestY = y; bestSum = x + y; }
}
stack.push(y);
}
System.out.println(bestX + " " + bestY);
}
尽管有嵌套循环,但时间复杂度是 O(n),因为内部循环总是从堆栈中弹出,并且每个元素只被推送一次,因此只能被弹出一次。
推荐阅读
- php - 在 Cpanel 中使用 Composer
- ionic-framework - 使用离子存储的存储不是持久的
- php - 每次购买的程序化成本
- python - 带字符串的多层 if 语句
- node.js - 在不刷新页面的情况下向帖子添加评论(如 Instagram)Node.js、Express、Mongoose
- php - 用于存储敏感数据的加密或密码术
- lua - 为什么 lua 解释器中的 -l 选项行为奇怪?
- javascript - 在不打开新连接的情况下发出 HTTP 请求
- c++ - 如何在 C++ 中处理大至 2^9000000 的整数
- python - 如何在 python 中处理 AssertError
给定一个未排序的数组 - arr 找到一对 arr[i] 和 arr[j] 使得
arr[i] < arr[j] & i<j
and(arr[i] + arr[j])
是最大的。
预期时间复杂度——O(n)
问题描述
给定一个未排序的数组 - arr 找到一对 arr[i] 和 arr[j] 使得
arr[i] < arr[j] & i<j
and(arr[i] + arr[j])
是最大的。
预期时间复杂度——O(n)
对于数组a = {4, 1, 3, 2, 5, 3}
pair is (4, 5).
这是我尝试过的代码..
void findPair(int[] a){
int n = a.length;
int max = a[0];
int secondMax = Integer.MIN_VALUE;
for(int i=1; i<n; i++){
if(a[i]>max){
secondMax = max;
max = a[i];
}
}
if(secondMax == Integer.MIN_VALUE){
System.out.println("-1 -1");
}
else{
System.out.println(secondMax+" "+max);
}
}
这是不可能的,你会得到下面的编译时错误。
无法从类型中对非静态方法示例(字符串)进行静态引用
这里(示例)在非静态区域中,主要方法是静态的。
解决方案
这是使用堆栈的解决方案。这个想法是堆栈始终包含一个降序,这样对于您查看的每个数字,它都可以与堆栈中低于它的最大数字配对。
使用时将数字弹出是安全的,因为例如,如果您有一个 6 并且堆栈的顶部是 3,则无需保留 3 以防它可以与更大的数字配对;如果以后有 7,您将等待将其与 6 而不是 3 配对。
public void solution(int[] arr) {
Stack<Integer> stack = new Stack<>();
int bestX = -1, bestY = -1, bestSum = -1;
for(int y : arr) {
while(!stack.isEmpty() && stack.peek() < y) {
int x = stack.pop();
if(x + y > bestSum) { bestX = x; bestY = y; bestSum = x + y; }
}
stack.push(y);
}
System.out.println(bestX + " " + bestY);
}
尽管有嵌套循环,但时间复杂度是 O(n),因为内部循环总是从堆栈中弹出,并且每个元素只被推送一次,因此只能被弹出一次。
推荐阅读
- php - 在 Cpanel 中使用 Composer
- ionic-framework - 使用离子存储的存储不是持久的
- php - 每次购买的程序化成本
- python - 带字符串的多层 if 语句
- node.js - 在不刷新页面的情况下向帖子添加评论(如 Instagram)Node.js、Express、Mongoose
- php - 用于存储敏感数据的加密或密码术
- lua - 为什么 lua 解释器中的 -l 选项行为奇怪?
- javascript - 在不打开新连接的情况下发出 HTTP 请求
- c++ - 如何在 C++ 中处理大至 2^9000000 的整数
- python - 如何在 python 中处理 AssertError