给定一个整数数组,返回一个数组。该返回数组中第i个数字为,原数组中第i个位置的数字至少往右走多少步才能遇到比它大的数字。如果遇不到或者已经处于最右的位置,则置为-1。
给定一个整数数组,返回一个数组。该返回数组中第i个数字为,原数组中第i个位置的数字至少往右走多少步才能遇到比它大的数字。如果遇不到或者已经处于最右的位置,则置为-1。
输入为多行,第一行为一个整数N,1≤N≤106
接下来一共有N行,每一行为一个整数M,0≤M≤232-1
输出 N 行,每行一个数字表示转换之后的数组
5 91 10 3 22 40
-1 2 1 1 -1
N = int(input().strip()) data = [] for i in range(N): data.append(int(input().strip())) dp = [-1] * N for i in range(N-1,-1,-1): cur = data[i] j = i + 1 while j < N: if i == N - 1: break if dp[j] == -1 and cur >= data[j]: break if data[j] > cur: dp[i] = j - i break j = j + dp[j] for i in dp: print(i)
import sys array = list(map(int,sys.stdin.readlines())) result, array, cur_max = [-1] * array[0], array[1:], array[len(array)-1] for idx, val in enumerate(array[::-1]): cur_idx = len(array) - 1 - idx if cur_idx < len(array) - 1: if val < array[cur_idx + 1]: result[cur_idx] = 1 cur_max = max(val, cur_max) elif val >= cur_max: cur_max = val else: jump = result[cur_idx+1] idx2 = cur_idx + 1 + jump while idx2 < len(array): if val < array[idx2]: result[cur_idx] = idx2 - cur_idx break jump = result[idx2] idx2 = idx2 + jump for pos in result: print(pos)
num = int(input()) block, stack, result = [], [], [] for i in range(num): block.append(int(input())) result.append(-1) i = 0 while(i<num): if (not(len(stack)==0)) and (block[i]>block[stack[-1]]): cur = stack.pop() result[cur] = i - cur else: stack.append(i) i += 1 for i in range(len(result)): print(result[i])
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; import java.util.Stack; import java.util.Arrays; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String strNum; while((strNum = br.readLine()) != null){ int n = Integer.parseInt(strNum); int[] data = new int[n]; for(int i = 0; i < n; i++) data[i] = Integer.parseInt(br.readLine()); int[] res = new int[n]; Arrays.fill(res, -1); int i = 0; // 栈用于存储待寻找右大元素的下标 Stack<Integer> stack = new Stack<>(); // 遍历数组元素,优先寻找栈顶元素的右大元素 while(i < n){ if(!stack.isEmpty() && data[i] > data[stack.peek()]){ /* 如果栈不为空,且当前元素大于栈顶元素时直接 计算当前元素与最近右大元素的距离*/ int cur = stack.pop(); // 栈顶元素的右大已经找到,弹出 res[cur] = i - cur; }else{ // 否则将当前元素的下标加入栈 stack.push(i); i += 1; } } for(Integer distance: res) System.out.println(distance); } } }
使用单调栈,复杂度O(N),具体解释以及类题,可以见博客:https://blog.csdn.net/xpy870663266/article/details/104935930
import sys N=int(input().strip()) nums=[int(input().strip()) for _ in range(N)] res=[-1]*N stack=[] for i in range(N-1,-1,-1): while len(stack)>0 and nums[i]>=nums[stack[-1]]: stack.pop() res[i]=stack[-1]-i if len(stack)>0 else -1 stack.append(i) print('\n'.join([str(x) for x in res]))
import sys n = int(input()) d = [] for line in sys.stdin: d.append(int(line)) stack = [] res = [-1] * n for i, value in enumerate(d): while stack and d[stack[-1]] < value: idx = stack.pop() res[idx] = i - idx stack.append(i) print(*res, sep = '\n')
importjava.util.*; publicclassMain { publicstaticvoidmain(String[] args) { //从后往前维护一个单调递减的栈,栈中保存的是索引,如果栈顶元素小于当前值,就pop栈顶元素 //当前位置的值为栈顶元素减当前值,如果栈为空,直接设置为1 Main test = newMain(); Scanner in = newScanner(System.in); intlen = in.nextInt(); int[] data = newint[len]; int[] res = newint[len]; for(inti = 0; i < data.length; i++) { intnum = in.nextInt(); data[i]=num; } ArrayDeque<Integer> deque = newArrayDeque<>(); for(inti = data.length-1; i >= 0; i--) { while(!deque.isEmpty()&&data[deque.getLast()]<=data[i]){ deque.pollLast(); } if(deque.isEmpty()){ res[i]=-1; }else{ res[i]=deque.getLast()-i; } deque.offer(i); } for(intre : res) { System.out.println(re); } } }
def rightbig(n,a): for i in range(n): temp=a[i:] if a[i]==max(temp): print(-1) else: count=-1 for j in temp: count+=1 if j>a[i]: print(count) break if __name__=='__main__': a=[] n=int(input()) for i in range(n): a.append(int(input())) print(rightbig(n,a))
import java.util.*; public class Main{ public static void main(String[] args){ Scanner in = new Scanner(System.in); int n = in.nextInt(); int[] d = new int[n]; for(int i=0; i<n; i++){ d[i] = in.nextInt(); } int[] ret = help(d); StringBuilder sb = new StringBuilder(); for(int i=0; i<ret.length; i++){ sb.append(ret[i]).append("\n"); } System.out.print(sb.toString()); } private static int[] help(int[] nums){ int[] ret = new int[nums.length]; Arrays.fill(ret, -1); Stack<Integer> s = new Stack<>(); for(int i=0; i<nums.length; i++){ while(!s.isEmpty() && nums[i] > nums[s.peek()]){ int top = s.pop(); ret[top] = i - top; } s.push(i); } return ret; } }
C++
#include <vector> #include <iostream> #include <algorithm> #include <stack> using namespace std; vector<int> solution(vector<int> &input){ vector<int> res(input.size(), 0); int temp = input.size()-1; stack<int> store; for(int i = temp; i >= 0; i--){ while(!store.empty() && input[i] >= input[store.top()]){ store.pop(); } if(store.empty()) res[i] = -1; else res[i] = store.top()-i; store.push(i); } return res; } int main(void){ int total; cin >> total; int number; vector<int> input; for(int i = 0; i < total; i++){ cin >> number; input.push_back(number); } vector<int> res = solution(input); for(auto cha : res) cout << cha << endl; return 0; }
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[] arr = new int[n]; for (int i = 0; i < n; i++) { arr[i] = sc.nextInt(); } int[] list = new int[n]; for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { if (arr[j] > arr[i]) { list[i] = j - i; break; } list[i] = -1; } } list[n - 1] = -1; for (int i : list) { System.out.println(i); } } }
#include <iostream> (720)#include <stack> #include <string> using namespace std; const int MAXN = 1000005; int num[MAXN]; int des[MAXN]; int main() { int n; cin>>n; stack<int> stack; for (int i = 0; i<n; i++) { cin >> num[i]; des[i] = -1; } int index = 0; while (index<n) { if (!stack.empty() && num[stack.top()]<num[index]) { int cur = stack.top(); stack.pop(); des[cur] = index - cur; } else { stack.push(index); index++; } } for (int i = 0; i<n; i++) { cout << des[i] << endl; } return 0; }