陣列和字串(1)陣列簡介【筆記】
陣列和列表、集合
陣列的基本操作:讀取、查詢、插入、刪除等
陣列在記憶體中是如何存放的?
C的陣列屬構造型別,是引用傳遞(傳遞的是
地址
),因此當把一個數組傳遞給一個函式/變數時,函式/變數運算元組會影響到原陣列。下圖為該書中的陣列存放的例子:
在你常用的語言中,如何對陣列執行初始化、資料訪問、修改、迭代、排序、新增、刪除等操作?
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]
分析::
定義左側下標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;
}
```