您當前的位置:首頁 > 攝影

陣列和字串(1)陣列簡介【筆記】

作者:由 Stella 發表于 攝影時間:2022-07-26

陣列和列表、集合

陣列和字串(1)陣列簡介【筆記】

陣列的基本操作:讀取、查詢、插入、刪除等

陣列和字串(1)陣列簡介【筆記】

陣列在記憶體中是如何存放的?

C的陣列屬構造型別,是引用傳遞(傳遞的是

地址

),因此當把一個數組傳遞給一個函式/變數時,函式/變數運算元組會影響到原陣列。下圖為該書中的陣列存放的例子:

陣列和字串(1)陣列簡介【筆記】

在你常用的語言中,如何對陣列執行初始化、資料訪問、修改、迭代、排序、新增、刪除等操作?

LeetCode 尋找陣列的中心索引

給你一個整數陣列 nums ,請計算陣列的中心下標 。

陣列中心下標是陣列的一個下標,其左側所有元素相加的和等於右側所有元素相加的和。

如果中心下標位於陣列最左端,那麼左側數之和視為 0 ,因為在下標的左側不存在元素。這一點對於中心下標位於陣列最右端同樣適用。

如果陣列有多箇中心下標,應該返回 最靠近左邊 的那一個。如果陣列不存在中心下標,返回 -1 。

方法:字首和

思路::記陣列的全部元素之和為total,當遍歷到第i個元素時,設其左側元素之和為sum,則其右側元素之和為total-nums[i]-sum

左右側元素相等即為sum=total-nums[i]-sum,即 2 * sum + nums[i] = total

當中心索引左側或右側沒有元素時,即為零個項相加,這在數學上稱作「空和」(empty sum)。在程式設計中我們約定「空和是零」。

分析::

定義所有元素和 total

定義左側元素和 sum

左側元素依次相加,直到左右側元素和相等,設定if條件語句,返回此時的下標i

```

c

int

pivotIndex

int

*

nums

int

numsSize

{

int

total

=

0

for

int

i

=

0

i

<

numsSize

++

i

{

total

+=

nums

i

];

}

int

sum

=

0

for

int

i

=

0

i

<

numsSize

++

i

{

if

2

*

sum

+

nums

i

==

total

{

return

i

}

sum

+=

nums

i

];

}

return

-

1

}

```

LeetCode 搜尋插入位置

給定一個排序陣列和一個目標值,在陣列中找到目標值,並返回其索引。如果目標值不存在於陣列中,返回它將會被按順序插入的位置。請必須使用時間複雜度為 O(log n) 的演算法。

方法:二分查詢

思路::先設定左側下標left和右側下標right,再計算中間下標mid。nums[mid]=target則返回下標,nums[mid]target則right左移。查詢結束如果沒有相等值則返回left,該值為插入位置。

分析::

定義左側下標left和右側下標right

計算中間下標mid = ((right - left) >> 1) + left ;(說明:右移運算子>>,運算結果正好能對應一個整數的二分之一值,這就正好能代替數學上的除2運算,但是比除2運算要快。mid=(left+right)>>1相當於mid=(left+right)/2)

比較nums[mid]和target的大小

```c

int searchInsert(int* nums, int numsSize, int target) {

int left = 0, right = numsSize - 1, ans = numsSize;

while (left <= right) {

int mid = ((right - left) >> 1) + left;

if (target <= nums[mid]) {

ans = mid;

right = mid - 1;

} else {

left = mid + 1;

}

}

return ans;

}

```

標簽: 陣列  下標  nums  left  mid