【发布时间】:2014-12-29 07:30:12
【问题描述】:
给定一个整数数组A和一个整数值K,创建数组B,其中B[i]是子数组A[i], A[i+1], ..., A[i+K-1]中的最小值。请注意,B.length 将等于 A.length - K。
例如对于K = 3 和A=[1,2,3,4,0,1,2],解决方案是B=[1,2,0,0,0]。
A = [1,2,3,4,0,1,2]
_____| | | | |
B[1] = 1 | | | |
_____| | | |
B[2] = 2 | | |
_____| | |
B[3] = 0 | |
_____| |
B[4] = 0 |
_____|
B[5] = 0
O(kn)时间复杂度的解决方案如下:
public static int[] createArray(int[] arr, int k) {
int[] result = new int[arr.length];
for (int i = 0; i <= arr.length - k; i++) {
int curSmallestVal = arr[i];
for (int j = i + 1; j < i + k; j++) {
curSmallestVal = Math.min(curSmallestVal, arr[j]);
}
result[i] = curSmallestVal;
}
return result;
}
你能提供一个更优雅的 O(n) 运行时解决方案吗? (可能使用队列)
使用 O(n) 解决方案更新:
public static int[] getMinSlidingWindow(int[] arr, int k) {
int[] result = new int[arr.length-k+1];
Deque<Integer> queue = new LinkedList<Integer>();
//initialize sliding window
for (int i = 0; i < k; i++) {
if (!queue.isEmpty() && arr[queue.getLast()] >= arr[i])
queue.removeLast();
queue.addLast(i);
}
for (int i = k; i < arr.length; i++) {
result[i-k] = arr[queue.getFirst()];
while (!queue.isEmpty() && arr[queue.getLast()] >= arr[i])
queue.removeLast();
queue.addLast(i);
while (!queue.isEmpty() && queue.getFirst() <= i-k)
queue.removeFirst();
}
result[arr.length-k] = arr[queue.removeFirst()];
return result;
}
【问题讨论】:
-
我不明白这个问题。你能提供一个更好的例子吗?什么是 K,它来自哪里?
-
示例改进。
-
谢谢你,Gergely Orosz。单词不好用的时候最好用数学方程。
-
这个问题更适合codereview。