1.1題目描述
輸入乙個整數陣列,實現乙個函式來調整該陣列中數字的順序,使得所有奇數字於陣列的前半部分,所有偶數字於陣列的後半部分。
示列:1.2題目分析輸入:nums = [1,2,3,4]
輸出:[1,3,2,4]
注:[3,1,2,4] 也是正確的答案之一。
方法一:利用快慢指標
定義兩個指標low和fast,都從下標為0的位置開始
只要fast沒有陣列越界,fast指標一直向前遍歷
遇到low指標的元素是偶數並且fast指向的元素是奇數就交換這兩個指標所指向的值
只有遇到low指向的元素不是偶數的時候,low指標才往前遍歷
以例子陣列來說,具體的過程如下:
**實現:
void
swap
(int
& a,
int& b)
vector<
int>
exchange
(vector<
int>
& nums)
if(nums[low]%2
!=0) fast++;}
return nums;
}
方法二:雙指標
定義兩個指標low和high。low從陣列的頭部開始找偶數,high從陣列的尾部開始找奇數
直到low>=high時退出尋找
**實現:
vector<
int>
exchange1
(vector<
int>
& arr)
if(arr[high]%2
==0)swap
(arr[low]
, arr[high]);
}return arr;
}int
main()
return0;
}
1、題目要求統計乙個數字在排序陣列**現的次數。
示例1輸入: nums = [5,7,7,8,8,10], target = 8
輸出: 2
示例22、題目分析輸入: nums = [5,7,7,8,8,10], target = 6
輸出: 0
方法一:挨個遍歷查詢
這樣做的時間複雜度最高,可達o(n)
int
search
(vector<
int>
& nums,
int target)
return count;
}
方法二:巧用二分查詢
基於上乙個方法時間複雜度太高,並且沒有充分利用陣列排序的特點,所以採用二分查詢的方式來求解,時間複雜度是o(logn)
定義兩個指標,low指向陣列的頭部,high指向陣列的尾部
利用二分查詢的方式,判斷陣列中間mid所指的數字是否和目標元素相同
如果相同的話,利用陣列排序的特點,目標元素的相鄰元素一定和目標元素是相同的,分別在左右子陣列中統計和目標數字相同的數字個數lcount和rcount
最後返回值為lcount+rcount+1
具體的,以下面以 nums = [5,7,7,8,8,10], target = 8這個例子加以分析
注意!!
還有特殊情況的處理,如果陣列中沒有元素應該return -1
int
search1
(vector<
int>
& arr,
int target)
int low =0;
int high = arr.
size()
-1;int countl =0;
int countr =0;
int count =0;
while
(low <= high)
while
(rlow < high && arr[
++rlow]
== target)
count = countl + countr +1;
break;}
}return count;
}
1、題目要求乙個長度為n-1的遞增排序陣列中的所有數字都是唯一的,並且每個數字都在範圍0~n-1之內。在範圍0~n-1內的n個數字中有且只有乙個數字不在該陣列中,請找出這個數字。
示例1:輸入: [0,1,3]
輸出: 2
示例2:限制:1 <= 陣列長度 <= 10000輸入: [0,1,2,3,4,5,6,7,9]
輸出: 8
2、題目分析
注意!:[0,1]表示陣列長度為n-1=2,所以n=3,共有3個數字,所以在之間的是[0,1,2];不能理解為只有2個數字,不缺失數字。這一點很重要。
方法一:兩次迴圈
第一次迴圈得到0~n-1的總和sum1,第二次迴圈得到陣列元素的總和sum2
返回sum1-sum2,即為缺失的那個數
但是這種方法不可取,時間複雜度太高,沒有充分利用陣列有序的特點
**實現:
int
missingnumber
(vector<
int>
& arr)
for(
int j =
0; j < arr.
size()
; j++
)return sum1 - sum2;
}
方法二:一次迴圈
根據陣列排列有序的特點。沒有缺失的數字一定是和其下標一一對應的
如果遇到沒有對應的數字則表示該下標對應的數字缺失
如果陣列遍歷完畢都沒找到缺失的數字,說明是陣列最後乙個數字缺失。返回arr.size()的值
**實現如下:
int
missingnumber1
(vector<
int>
& arr)
return arr.
size()
;}
方法三:二分查詢
二分查詢的思路還是根據下標和陣列中的值來判斷缺失元素。但是相比於方法三更好的是一次可以捨棄一半的資料
如果==mid等於arr[mid]==的值相等的話,表示在mid之前都是按照順序沒有缺失存放的,那麼就在後半邊陣列中去尋找,high = mid+1.
如果mid和arr[mid]的值不相等的話。比較mid-1和arr[mid-1]的值是否相等
3.1如果相等就表示mid即為缺失的數字
3.2如果不相等,則表示缺失的值,在mid前面。讓high = mid-1
查詢到最後返回值的**。返回值不應該是mid。比如下面這個例子
所以二分查詢跳出迴圈過後需要返回low,而不是mid.
**實現如下:
int
missingnumber2
(vector<
int>
& arr)
else
//左半部分有問題
}return low;
}int
main()
劍指offer 簡單題
用兩個棧來實現乙個佇列,完成佇列的push和pop操作。佇列中的元素為int型別。思路 變向隻變一次,s2空了之後再把s1全部搬過去 class solution int pop key stack2.top stack2.pop return key private stackstack1 sta...
劍指offer 簡單題 一
因為這幾題太簡單了,總結一下思路就行了。知識點 陣列 其實就是for迴圈加個判斷條件。牛客上有人呼叫了一些大數之類的api,感覺沒啥必要。為了ac可以,面試的時候這樣是真的秀逗了。給定乙個陣列a 0,1,n 1 請構建乙個陣列b 0,1,n 1 其中b中的元素b i a 0 a 1 a i 1 a ...
劍指offer 陣列
資料是最簡單的資料結構,它佔據一塊連續的記憶體並按照順序儲存資料。建立陣列時,首先指點陣列的容量大小,然後根據大小分配記憶體。缺點 空間效率不高。經常有空閒的區域滅有得到充分利用。優點 時間效率很高。可以根據時間效率高的特點,來實現簡單的雜湊表 把陣列的下標設為雜湊表的鍵值,陣列中的每乙個數字設為雜...