二分法之旋轉陣列系列

2021-10-07 21:40:56 字數 4424 閱讀 7335

給定乙個陣列,將陣列中的元素向右移動 k 個位置,其中 k 是非負數。

要求使用空間複雜度為 o(1) 的 原地 演算法。

解法一 雙重迴圈

class

solution

:def

rotate

(self, nums: list[

int]

, k:

int)

->

none

:"""

do not return anything, modify nums in-place instead.

"""n =

len(nums)

k %= n

for i in

range

(k):

last = nums[n-1]

for j in

range

(n-1,0

,-1)

: nums[j]

= nums[j -1]

nums[0]

= last

雙重迴圈

* 時間複雜度:o(kn)

* 空間複雜度:o(1)

解法二 插入法

class

solution

:def

rotate

(self, nums: list[

int]

, k:

int)

->

none

:"""

do not return anything, modify nums in-place instead.

"""n =

len(nums)

k %= n

while k:

nums.insert(

0, nums.pop())

k -=

1

解法三 拼接法
class

solution

:def

rotate

(self, nums: list[

int]

, k:

int)

->

none

:"""

do not return anything, modify nums in-place instead.

"""n =

len(nums)

k %= n

nums[:]

= nums[

-k:]

+ nums[

:-k]

解法四 三次翻轉法
class

solution

:def

rotate

(self, nums: list[

int]

, k:

int)

->

none

:"""

do not return anything, modify nums in-place instead.

"""n =

len(nums)

k %= n

nums[:]

= nums[::

-1] nums[

:k]= nums[

:k][::

-1] nums[k:

]= nums[k:][

::-1

]

設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。

( 例如,陣列[0,1,2,4,5,6,7]可能變為[4,5,6,7,0,1,2])。

搜尋乙個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回 -1 。

你可以假設陣列中不存在重複的元素。

你的演算法時間複雜度必須是 o(log n) 級別。

解析:演算法時間複雜度必須是 o(log n) 級別,所以只能用二分法.

先找中點,然後在有序的那一部分進行二分查詢

如果nums[mid] == target,恰好找到,返回mid

如果nums[mid] < nums[right],則中點在右半部分,且midright之間這部分是有序的,接下來判斷target是否在midright之間,如果是,收緊左邊界,也即left=mid+1

如果nums[mid[ >=nums[right],則中點在左半部分,且leftmid之間這部分是有序的,接下來判斷target是否在leftmid之間,如果是,收緊右邊界,也即right=mid-1

class

solution

:def

search

(self, nums: list[

int]

, target:

int)

->

int:

n =len(nums)

left =

0 right = n -

1while left <= right:

mid = left +

(right - left)//2

if target == nums[mid]

:return mid

if nums[mid]

< nums[right]

:if nums[mid]

< target and nums[right]

>= target:

left = mid +

1else

: right = mid -

1else

:if nums[mid]

> target and nums[left]

<= target:

right = mid -

1else

: left = mid +

1return

-1

假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。

( 例如,陣列 [0,0,1,2,2,5,6] 可能變為 [2,5,6,0,0,1,2] )。

編寫乙個函式來判斷給定的目標值是否存在於陣列中。若存在返回 true,否則返回 false。

這是 搜尋旋轉排序陣列 的延伸題目,本題中的 nums可能包含重複元素

class

solution

:def

search

(self, nums: list[

int]

, target:

int)

->

bool

: n =

len(nums)

left =

0 right = n -

1while left <= right:

while left < right and nums[left]

== nums[left +1]

: left +=

1while left < right and nums[right]

== nums[right -1]

: right -=

1 mid = left +

(right - left)//2

if nums[mid]

== target:

return

true

if nums[mid]

< nums[right]

:if nums[mid]

< target and nums[right]

>= target:

left = mid +

1else

: right = mid -

1else

:if nums[mid]

> target and nums[left]

<= target:

right = mid -

1else

: left = mid +

1return

false

LeetCode 二分法在旋轉陣列應用系列

這個系列整理一下旋轉陣列,就是原始單調不減陣列,在預先未知的某個下標 k 0 k nums.length 上進行了 旋轉,使陣列變為 nums k nums k 1 nums n 1 nums 0 nums 1 nums k 1 針對這種陣列,兩個要求,乙個找到分界點k,另乙個是給乙個target,...

二分法旋轉陣列找最小數

一 題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。note 給出的所有元素都大於0,若陣列大小為0,請返回0。示例1輸入 3,4,5,1,2 返回值1 二 思路 這道題要求用二分法,一開始用的是遍歷的方法,時間...

33 搜尋旋轉排序陣列 二分法 旋轉陣列

題目實際考察的是二分法。雖然旋轉後的陣列是部分有序的,但是由於每次迭代都必然有一部分 左部分或者右部分 是有序的,此時可以判斷當前數是否在有序的那部分,進而控制上下界。package com.walegarrett.interview author walegarrett date 2021 2 2...