找出数组中每一个元素右边第一个大于它的数

解题思路:

整体思路有点像映射的关系,如果存在对应元素的比它第一个大的数,就在一个数组对应位置存在这个大值,具体思路如下:

利用栈,从左到右依次压入数组中元素的索引,每次判断待压入的下一个元素是否大于占栈顶索引对应的元素,若大于,就将元素存到一个新的数组res中,将栈顶索引出栈,对应位置就是栈中刚刚出栈的索引,若小于就压入栈中。最后判断一下剩余的元素,没有大于它的就在res索引位置置-1.

代码实现:

public class Test{
	public static int[]findMax(int []arry){
		int len=arry.length;
		int i=0;
		int []res=new int[len];
		Stack<Integer> sk=new Stack<Integer>();
		while(i<len){
			if(sk.isEmpty()||arry[i]<arry[sk.peek()]){
				sk.push(i);
				i++;
			}else{
				res[sk.pop()]=arry[i];
			}
		}
		while(!sk.isEmpty()){
			res[sk.pop()]=-1;
		}
		return res;
	}
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		int array[]=new int[] {1,5,3,6,4,8,9,10};
		int res[]=findMax(array);
		for(int num:res) {
			System.out.println(num);
		}
	}
折半查(Binary Search),又称为二分查,是一种在有序数组中特定元素的搜索算法。它通过比较数组中间元素与目标值的大小,来决定是向组的左半部分还是右半部分继续查,每次都将搜索范围缩小一半,直到到目标值或者搜索范围为空。 在有序数组中使用折半查找出一个数组中第几个元素的步骤通常如下: 1. 确定查范围的起始位置`left`和结束位置`right`。 2. 计算中间位置`mid`,公式为:`mid = (left + right) / 2`(如果组元素量很大时,为了防止整溢出,也可以使用`mid = left + (right - left) / 2`)。 3. 比较中间位置的元素与目标值: - 如果中间位置的元素正好是目标值,则返回该元素的索引(组的索引从0开始计)。 - 如果目标值小于中间位置的元素,则目标值只可能存在于左半部分的数组中,更新`right`为`mid - 1`,然后回到步骤2。 - 如果目标值大于中间位置的元素,则目标值只可能存在于右半部分的数组中,更新`left`为`mid + 1`,然后回到步骤2。 4. 如果`left`超过了`right`,说明没有到目标值,可以返回一个表示未到的特殊值,如`-1`。 以下是折半查的一个简单实现示例(假设组为升序排列): ```python def binary_search(arr, target): left, right = 0, len(arr) - 1 while left <= right: mid = (left + right) // 2 if arr[mid] == target: return mid # 返回目标值在数组中的索引 elif arr[mid] < target: left = mid + 1 else: right = mid - 1 return -1 # 未到目标值 # 使用示例 arr = [1, 3, 5, 7, 9] target = 5 index = binary_search(arr, target) print(f"目标值{target}是数组中的第{index + 1}个元素。") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值