1. 集合、列表和数组
集合一般被定义为:由一个或多个确定的元素所构成的整体。
这很容易理解,高中已经接触过这个概念,举个例子:班里的同学作为一个集合。显然,这是符合集合的定义的
集合的特性之一就是无序性,集合里的元素没有先后顺序之分;第二个特性就是集合里的元素类型不一定要相同。
列表(又称线性列表)的定义为:是一种数据项构成的有限序列,即按照一定的线性顺序,排列而成的数据项的集合。列表的概念是在集合的特征上形成的,它具有顺序,且长度是可变的。这和集合是不同的。列表最常见的表现形式有数组和链表,而栈和队列则是两种特殊类型的列表。
数组是列表的一种表现形式,它有两个最重要的概念:第一个是索引(index),通过索引,我们可以轻松访问数组中的元素。第二个是数组中的元素是连续存储的,且每个元素占用相同大小的内存
2. 数组的操作
3. LC
A 寻找数组的中心索引
给你一个整数数组 nums ,请计算数组的中心下标 。
数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。
如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。
如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回 -1 。
示例:
输入:nums = [1, 7, 3, 6, 5, 6]
输出:3
解释:
中心下标是 3 。
左侧数之和 sum = nums[0] + nums[1] + nums[2] = 1 + 7 + 3 = 11 ,
右侧数之和 sum = nums[4] + nums[5] = 5 + 6 = 11 ,二者相等。
题解代码:
class Solution {
public:
int pivotIndex(vector<int>& nums) {
int sum1 = 0;
int sum2 = 0;
for(int i = 0;i < nums.size();i++)
{
sum2 = sum2 + nums[i];
}
for(int j = 0;j < nums.size();j++)
{
if(sum1 == (sum2 - nums[j]))
{
return j;
}
else
{
sum1 = sum1 + nums[j];
sum2 = sum2 - nums[j];
}
}
return -1;
}
};
B 寻找数组的中心索引
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
示例:
输入: nums = [1,3,5,6], target = 5
输出: 2
输入: nums = [1,3,5,6], target = 2
输出: 1
题解代码:
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int left = 0;
int right = nums.size()-1;
while (left <= right)
{
int middle = left + ((right-left)/2);
if(nums[middle] < target){
left = middle+1;
}
else if (nums[middle] > target)
{
right = middle -1;
}
else if (nums[middle]==target){
return middle;
}
}
return right + 1;
}
};
C 合并区间
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。
示例:
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
题解代码:
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
int n = intervals.size();
if(n==1)
return intervals;
sort(intervals.begin(), intervals.end());
vector<vector<int>> vec;
vec.push_back(intervals[0]);
int j =0;
for(int i = j+1;i<n;i++){
if(intervals[i][0]<=vec[j][1])
vec[j][1]=max(vec[j][1],intervals[i][1]);
else{
vec.push_back(intervals[i]);
j++;
}
}
return vec;
}
};