給定乙個陣列,將陣列中的元素向右移動 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]
,則中點在右半部分,且mid
和right
之間這部分是有序的,接下來判斷target
是否在mid
和right
之間,如果是,收緊左邊界,也即left=mid+1
如果nums[mid[ >=nums[right]
,則中點在左半部分,且left
和mid
之間這部分是有序的,接下來判斷target
是否在left
和mid
之間,如果是,收緊右邊界,也即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...