数组和字符串
数组简介
寻找数组的中心索引
题目要求
-
给你一个整数数组 nums ,请计算数组的 中心下标 。
-
数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。
-
如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。
-
如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回 -1 。
解法-要点
psum*2 + nums[i] == sum。即此位置前所有元素的2倍加上此位置的元素等于数组所有的和。
代码
class Solution {
public:
int pivotIndex(vector<int>& nums) {
int sum = 0,psum=0;
for (int i : nums) // 求和
{
sum += i;
}
for(int i =0;i<nums.size();i++){
if(psum*2 + nums[i] == sum){ //比对
return i;
}
psum +=nums[i];
}
return -1;
}
};
搜索插入位置
题目要求
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
算法-要点
采用二分法,如果查到到返回middle(中间位置);循环判断条件( start <= end );最后返回start。
代码
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int start = 0, end = nums.size()-1, i = 0;
while (start <= end)
{
i = (start + end) / 2;
if (target == nums[i])
{
return i;
}else if(target < nums[i]){
end = i-1;
}else{
start = i+1;
}
}
return start;
}
};
合并区间
题目要求
以数组 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].
算法-要点
对原来区间进行排序,新建一个列表vec保存新的集合信息。将第一条集合加入新节点,比对下一个节点(区间)的左值是否大于新节点的右值。如果大于将此区间加入新集合。如果小于修改vec的右值为vec原来右值和原区间的右值的最大值。
代码
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]); // 先将第一个区间加入
// i从1开始控制原数组 j从零开始控制新数组
for (int i = 1, j = 0; i < intervals.size(); 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;
}
};
二维数组简介
旋转矩阵
题目描述
给你一幅由 N × N
矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。
不占用额外内存空间能否做到?
解法-要点
使用辅助空间存储数据。matrix_new[j][n - i - 1] = matrix[i][j];
n - i - 1:从大到小。i:从小到大
解法-代码
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int n = matrix.size();
// C++ 这里的 = 拷贝是值拷贝,会得到一个新的数组
auto matrix_new = matrix;
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
{
matrix_new[j][n - i - 1] = matrix[i][j];
}
}
// 这里也是值拷贝
matrix = matrix_new;
}
};