1. 程式人生 > >面試題8:旋轉陣列的最小值(Leetcode-153,154)

面試題8:旋轉陣列的最小值(Leetcode-153,154)

題目:把一個數組最開始的若干元素搬到陣列的末尾,稱為陣列的旋轉。
輸入一個遞增陣列的一個旋轉,輸出其最小值。假設這個遞增陣列中沒有重複元素
例如陣列{3,4,5,1,2}是{1,2,3,4,5}的一個旋轉,最小值是1。

一. O(N)解法

最直觀的解法就是遍歷陣列,找到一對相鄰的數,前數比後數大,則後數就是最小值。
如果未找到這樣一對相鄰的數,那麼這個陣列就未旋轉,最小值即為第一個數。

int findMin(vector<int>& nums) {
    int size = nums.size();   
    for(int i=1; i<size; ++i)
    {
        if
(nums[i] < nums[i-1]) { return nums[i]; } } return nums[0]; }

二. O(logN)解法

顯然,這種解法未利用旋轉陣列的特性,我們可以用類似二分法的方法找到這個最小數。分析如下:
這裡寫圖片描述

如果在迴圈中p1=p2,說明這個陣列就未旋轉,則要跳出迴圈,第一個數就是最小數。

int findMin(vector<int>& nums) {
    int size = nums.size();
    int left = 0, right
= size-1; int mid = 0; while(nums[left] >= nums[right]) { if(left == right) { break; } if(right-left == 1) { return nums[right]; } mid = (left+right)/2; if(nums[mid] >= nums[left]) { left
= mid; } else { right = mid; } } return nums[0]; }

三. 旋轉陣列中存在重複元素(Leetcode-154)

如果旋轉陣列為{10,1,10,10}。
O(logN)的解法就無法使用了。
只能用第一種O(N)解法。

相關推薦

試題8旋轉陣列Leetcode-153,154

題目:把一個數組最開始的若干元素搬到陣列的末尾,稱為陣列的旋轉。 輸入一個遞增陣列的一個旋轉,輸出其最小值。假設這個遞增陣列中沒有重複元素 例如陣列{3,4,5,1,2}是{1,2,3,4,5}的一個旋轉,最小值是1。 一. O(N)解法 最直觀的解

劍指offer{試題8旋轉陣列數字}

思路:還是設定兩個指標,一頭一尾,隨時變動指標,左半部分大指標往中間去,右半部分大指標前移, public class test08 { /** * 把一個數組最開始的若干個元素搬到陣列的末尾, 我們稱之陣列的旋轉。 * 輸入一個遞增

【劍指offer python】試題8旋轉陣列數字

題目連結 題目描述 把一個數組最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入一個非減排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。 例如陣列{3,4,5,1,2}為{1,2,

【劍指Offer】試題8旋轉陣列數字

一:題目描述 把一個數組最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入一個非遞減排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。 例如陣列{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該陣列的最小值為1。 NOTE:給出的所有元素都大於0,若陣列大

試題11旋轉陣列數字

一、題目     把一個數組最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入一個遞增排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。例如陣列{3, 4, 5, 1, 2}為{1, 2, 3, 4, 5}的一個旋轉,該陣列的最小值為1。二、解法分析:這道題最直觀的解法

劍指Offer第二版試題11旋轉陣列數字

劍指Offer面試題11:旋轉陣列的最小數字題目一:把一個數組最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入一個遞增排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。例如,陣列{3,4,5,1

隨筆-尋找旋轉排序陣列中的有重複元素

題目: 假設按照升序排序的陣列在預先未知的某個點上進行了旋轉。 ( 例如,陣列 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1,2] )。 請找出其中最小的元素。 注意陣列中可能存在重複的元素。 示例 1: 輸入: [1,3,5] 輸出: 1

隨筆-尋找旋轉排序陣列中的無重複數字

題目: 假設按照升序排序的陣列在預先未知的某個點上進行了旋轉。 ( 例如,陣列 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1,2] )。 請找出其中最小的元素。 你可以假設陣列中不存在重複元素。 示例 1: 輸入: [3,4,5,1,2] 輸

JS 求一組陣列中的不包括0

<body> <script type="text/javascript"> var arr=[]; do{ var num=prompt("請輸入一個整數:") if(num!=0){

劍指offer試題單例模式的實現使用C++語言

#include <iostream> #include <iomanip> #include <cstdio> #include <cstdlib>

練習4-10 找出 20 point(s)

練習4-10 找出最小值 (20 point(s)) 本題要求編寫程式,找出給定一系列整數中的最小值。 輸入格式: 輸入在一行中首先給出一個正整數n,之後是n個整數,其間以空格分隔。 輸出格式: 在一行中按照“min = 最小值”的格式輸出n個整數中的最小值。 輸入樣例:

試題11:求旋轉陣列數字

題目:把一個數組最開始的若干個元素搬到陣列末尾,即陣列的旋轉; 例如:{3,4,5,1,2}是{1,2,3,4,5}的一個旋轉,輸出該陣列的最小值1 程式碼如下: #include<stdio.h> #include<stdlib.h> #include&

劍指Offer試題33陣列排成的數 Java 實現,三種方法

題目:把陣列排成最小的數    輸入一個正整數陣列,把數組裡所有數字拼接起來排成一個數,列印能拼接出的所有數字中最小的一個。例如輸入陣列{3,32,321},則打印出這3個數字能排成的最小數字321323. 演算法分析: 1.最直接的辦法就是先求出這個陣列中所有數字

試題37陣列排成的數

題目: 輸入一個正整數陣列,把數組裡所有數字拼接起來排成一個數,列印能拼接出的所有數字中最小的一個。 邊界條件及異常: 陣列為空 思路: 這題可以需要建立對任意兩個數自己的比較規則。然後根據這個規則進行排序即可。 如果是單位數,顯然小的在前。 如果是32和321,結合後有3

8旋轉陣列數字PYTHON

把一個數組最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入一個非遞減排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。 例如陣列{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該陣列的最小值為1。 NOTE:給出的所有元素都大於0,若陣列大小

試題8二叉樹的下一個節點

可能 除了 遍歷算法 term size csdn play 技術 ptr 一.題目給定一棵二叉樹和其中的一個結點,如何找出中序遍歷順序的下一個結點?樹中的結點除了有兩個分別指向左右子結點的指針以外,還有一個指向父結點的指針。二.思路分析題目之後,我們發現,待處理節點只存在

旋轉陣列數字無重複數字

class Solution { public: int minNumberInRotateArray(vector<int> rotateArray) { if(rotateArray.size()==1) {

劍指offer 試題8二叉樹的下一個節點 c++

題目:給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標。 解析:三種情況:1.若節點有右子樹,中序下一個就是 右子樹最左孩子節點  2.若無右子樹,且當前節點是父節點的左子節點,下一個就是父節點 &nb

《劍指offer》試題8二叉樹的下一個節點

題目:給定一顆二叉樹和其中的一個節點,如何找出中序遍歷序列的下一個節點?樹中的節點除了有兩個分別指向左、右子節點的指標,還有一個指向父節點的指標。 二叉樹的節點定義如下: struct BinaryTreeNode { int m_nValue; BinaryTreeNode*

LeetCode--153 尋找旋轉排序陣列中的 Find Minimum in Rotated Sorted ArrayC語言版

題目描述: 解題思路:可以使用順序遍歷,將最小值記錄下來,時間複雜度為O(n),但是根據題目描述,該陣列為旋轉排序陣列,這裡就可以聯想到二分查詢,試著用二分查詢的思想,首先使用Lindex和Rindex記錄左右區間的下標,然後再用Mindex表示區間中間元素的下標,根據