找出数组中的一个数,在该数的左边他是最大的,在该数的右边他是最小的。如何求这个数

首先。假设数组为nums[] = {1, 4 3, 6, 8,10}。很明显可以看出 6、8大于左边所有数缺小于右边所有数。那如果用代码表示思路是怎么样子的?

我们可以开一个leftmax数组和一个rightmin数组。分别用来存放左边的最大值和右边的最小值

    nums[] = {
    
    1,4,3,6,8,10}
 leftmax[] = {
    
    1,4,4,6,8,10} // leftmax[0] = nums[0]  leftmax[i] = max(leftmax[i-1], nums[i])  i++ 从左往右
rightmin[] = {
    
    1,3,3,6,8,10} // rightmin[5]= nums[5] rightmin[i] = min(rightmin[i+1], nums[i]) i-- 从右往左

// 然后开始遍历arr数组 nums[i] > leftmax[i-1] 同时 nums[i] < rightmin[i + 1] ==> nums[i] 满足要求
// 表示arr[i]大于他左边的最大值同时小于右边的最小值 即可证明在做左边最大,在右边最小

在这里插入图片描述
4比左边最大值1大,比右边最小值3大。不符合比右边小的条件
3比左边最大值4小,不符合比左边大的条件
6比左边最大值4大,比右边最小值8小,满足条件
8比左边最大值6大,比右边最小值10小,满足条件

用代码表示如下

	 	// 左边最大值
	    int[] leftmax= new int[nums.length];
        leftmax[0] = nums[0]; // 赋值第一个元素
        for(int i = 1; i < nums.length - 1; i++) {
    
    
            leftmax[i] = Math.max(nums[i], leftmax[i - 1]);
        }
	    // 右边最小值
        int[] rightmin= new int[nums.length];
        rightmin[nums.length - 1] = nums[nums.length - 1]; // 赋值最后一个元素
        for(int i = nums.length - 2; i > 0; i--) {
    
    
            rightmin[i] = Math.min(rightmin[i + 1], nums[i]);
        }
        // 遍历原数组
        for(int i = 1; i < nums.length - 1; i++) {
    
    
            if(nums[i] > leftmax[i - 1] && nums[i] < rightmin[i + 1]) {
    
    
                return nums[i];
            }
        }

おすすめ

転載: blog.csdn.net/weixin_51993595/article/details/120381092