首页 > 其他分享 >旋转数组的最小数字

旋转数组的最小数字

时间:2024-11-15 09:16:22浏览次数:3  
标签:begin end int arr 最小 最小值 数组 旋转

题目
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{2,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1.
解题思路
看到“递增数组”和“查找最小值”,就要想到二分法。
在这里插入图片描述
有两种切割方法,一种是右边多切一点,另一种是左边多切一点。
在这里插入图片描述
画一条绿色中点线,可以发现最小值出现在红白相间的一边。红色的区域可以舍弃掉,而红色区域是完全递增数组。所以在二分查找过程中不断舍弃完全递增区域即可找到最小值。
在这里插入图片描述

package com.company;

public class Main {

    public static void main(String[] args) {
	    // write your code here
        int[] arr={3,4,5,1,2};
        Main main=new Main();
        System.out.println(main.min(arr, 0, arr.length - 1));

    }
    public int min(int[] arr,int begin,int end){
        int mid=(begin+end)/2;
        //只剩begin和end两个元素的时候停止递归
        if(begin+1==end){
            //因为begin,end所在区域是红白相间区域即非递增区域,所以begin大,end小。最小值是end。
            return arr[end];
        }
        if(arr[begin]<=arr[mid]){//左侧是红色区域(递增数组)
            return min(arr,mid,end);//右侧是红白相间区域,最小值在这里面
        }else{//右侧是红色区域
            return min(arr,begin,mid);
        }
    }


}

这种解法只能求解数组元素不重复的情况,重复的话需要将数组元素全部比较一次。

标签:begin,end,int,arr,最小,最小值,数组,旋转
From: https://blog.csdn.net/zhourongxiang1/article/details/143785677

相关文章

  • leetcode 数组专题 06-扫描线算法(Sweep Line Algorithm)
    扫描线专题leetcode数组专题06-扫描线算法(SweepLineAlgorithm)leetcode数组专题06-leetcode.218the-skyline-problem力扣.218天际线问题leetcode数组专题06-leetcode.252meetingroom力扣.252会议室leetcode数组专题06-leetcode.253meetingroomii力扣.253......
  • C语言:数组(一维数组,二维数组,数组越界,数组作为函数参量,冒泡排序)
    1、一维数组的创建和初始化1.1、数组的创建数组是相同类型元素的集合•数组中可以存放1个或者多个数据•数组中存放的数据,类型是相同的数组的创建方式:元素类型自定义数组名(常量表达式)比如:intarr[10]doublearr[5]chararr[8+5]错误写法:intarr[n];......
  • 代码随想录:有序数组的平方
    代码随想录:有序数组的平方仍然是双指针,一开始也想到了双指针,不过很笨的创造了两个数组,一个负数的一个正数的,两个数组比大小后插入。但其实可以直接把原数组平方后,从左右两边插入。有两点值得注意:1.已知数组大小的情况下,可以直接倒着插入数组。2.创建vector时需要指定元素的个数......
  • 郝玩的数据结构2——树状数组(待upd)
    首先,拉张图树状数组,相对于线段树来说,空间复杂度更小,但是可以处理的信息具有局限性常用于处理区间(矩阵)查改(差分转化为单点查改),单点查改板子题1Accode:点击查看代码#include<bits/stdc++.h>#definelowbitx&-xusingnamespacestd;intn,m,s[500005];voidchange(intx......
  • Java 数组操作:反转、扩容与缩容
    在Java中,数组是一种固定长度的数据结构,一旦创建,其大小无法更改。然而,常常在实际编程中,我们需要对数组进行扩容、缩容或其他操作。本文将介绍如何通过Java实现数组反转、扩容和缩容的操作,并在代码中演示这些常见的数组操作。1.数组反转数组反转是一个常见的操作,通常用于......
  • 代码随想录算法训练营第一天| 704. 二分查找、35.搜索插入位置、27. 移除元素、977.有
    文档讲解:代码随想录视频讲解:代码随想录状态:完成4道题一、数组理论基础数组:连续内存空间,存储类型相同的元素集合,适合读不适合写注意:Python里可以存储不同类型的元素,但刷题时都是按照相同元素去做的相同元素占用存储的空间大小是一样的,下一个元素的位置就确定了数组时间......
  • 代码随想录算法训练营第二天| 209.长度最小的子数组、59. 螺旋矩阵 II
    文档讲解:代码随想录视频讲解:代码随想录状态:完成2道题滑动窗口滑动窗口:两个指针一前一后组成滑动窗口,并计算滑动窗口中的元素的问题适用场景:字符串匹配问题、子数组问题、定长问题滑动窗口模板:如果一个字符进入窗口,应该增加windows计数器;如果一个字符将移除窗口的......
  • 二分找最小绝对值
    Klee'sSUPERDUPERLARGEArray!!!每次测试时间限制:2秒每次测试的内存限制:256MB题目描述Klee拥有一个长度为n的数组a,数组中的元素依次为[k,k+1,...,k+n-1]。Klee希望选择一个索引i(1≤i≤n),使得x=|a1+a2+⋯+ai-ai+1-⋯-an|最小。其中对于任意......
  • C#学习 数组(22)
    创建数组string[]cars={"Volvo","BMW","Ford","Mazda"};int[]myNum1={10,20,30,40};int[]myNum2=newint[4]{10,20,30,40};int[]myNum3=newint[]{10,20,30,40};int[]myNum4=newint[4];myNum4[0]=10;......
  • P8863 「KDOI-03」构造数组
    P8863「KDOI-03」构造数组cplusoj:SS241113D.构造数组(array)题意给你一个长度为\(n\le5000\)的数组\(\{b\}\),满足\(\sumb\le30000\)。每次操作你可以选择两个下标\(i,j,i\neqj\),将\(b_i,b_j\)减\(1\),问有多少种操作方式使得\(b\)变成全部是\(0\)。思路看......