class Solution {
public:
int maxSubArray(vector<int>& nums){
int result = nums[0];
for(int i =1;i<nums.size();++i){
if(nums[i-1]>0)
nums[i]+= nums[i-1];
result = max(result,nums[i]);}return result;}};
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals){
sort(intervals.begin(),intervals.end());
int start = intervals[0][0];
int end = intervals[0][1];
vector<vector<int>> result;
for(int i =1;i<intervals.size();++i){
if(end<intervals[i][0]){
result.push_back(vector<int>{start,end});
start = intervals[i][0];
end = intervals[i][1];}else
end = max(end,intervals[i][1]);}
result.push_back(vector<int>{start,end});return result;}};
3、轮转数组
(1)题目描述以及输入输出
(1)题目描述:
给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
(2)输入输出描述:
输入: nums =[1,2,3,4,5,6,7], k =3
输出: [5,6,7,1,2,3,4]
关键思路:
使用三次reverse,先翻转整个数组,再翻转前k个元素,最后翻转剩余元素。
(2)代码块
class Solution {
public:
void rotate(vector<int>& nums, int k){
if(k>nums.size())k = k%nums.size();
reverse(nums.begin(),nums.end());
reverse(nums.begin(),nums.begin()+k);
reverse(nums.begin()+k,nums.end());}};
(1)题目描述:
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
(2)输入输出描述:
输入:matrix =[[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
关键思路:
设置up down left right四个自变量,顺时针遍历,
上,up++;右,right--;下,down--;左,left++。
(2)代码块
classSolution{public:
vector<int>spiralOrder(vector<vector<int>>& matrix){
vector<int> result;int up =0,down = matrix.size()-1,left =0,right = matrix[0].size()-1;while(1){for(int i = left;i<=right;i++)result.push_back(matrix[up][i]);if(++up>down)break;for(int i = up;i<=down;i++)result.push_back(matrix[i][right]);if(--right<left)break;for(int i = right;i>=left;i--)result.push_back(matrix[down][i]);if(--down < up)break;for(int i = down;i>=up;i--)result.push_back(matrix[i][left]);if(++left>right)break;}return result;}};
7、旋转图像
(1)题目描述以及输入输出
(1)题目描述:
给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
(2)输入输出描述:
输入:matrix =[[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
输出:[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]
关键思路:
现将矩阵进行转置,再进行水平翻转。
(2)代码块
class Solution {
public:
void rotate(vector<vector<int>>& matrix){
for(int i =0;i<matrix.size();i++){
for(int j =0;j<i;j++){
swap(matrix[i][j],matrix[j][i]); // 转置,只遍历左下角
}}
for(int i =0;i<matrix.size();i++){
for(int j =0;j<matrix.size()/2;j++){
swap(matrix[i][j],matrix[i][matrix.size()-j-1]); // 水平翻转
}}}};
8、搜索二维矩阵||
(1)题目描述以及输入输出
(1)题目描述:
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:
每行的元素从左到右升序排列。
每列的元素从上到下升序排列。
(2)输入输出描述:
输入:matrix =[[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target =5
输出:true
关键思路:
遍历每行,对于每行的数组,采用二分查找的方式
(2)代码块
classSolution{public:boolsearchMatrix(vector<vector<int>>& matrix,int target){if(matrix.empty())returnfalse;for(int i =0;i<matrix.size();i++){int left =0,right = matrix[0].size()-1;if(target>=matrix[i][0]&& target<=matrix[i][matrix[0].size()-1]){while(left<=right){int mid =(left+right)/2;if(target>matrix[i][mid])left = mid+1;elseif(target<matrix[i][mid])right = mid-1;elsereturntrue;}}elseif(target < matrix[i][0])break;}returnfalse;}};
classSolution{public:intsearchInsert(vector<int>& nums,int target){int left =0;int right = nums.size()-1;int mid;while(left<=right){
mid =(left+right)/2;if(nums[mid]<target)
left = mid+1;elseif(nums[mid]>target)
right = mid-1;elsereturn mid;}return right+1;}};
10、搜索二维矩阵
(1)题目描述以及输入输出
(1)题目描述:
给你一个满足下述两条属性的 m x n 整数矩阵:
每行中的整数从左到右按非严格递增顺序排列。
每行的第一个整数大于前一行的最后一个整数。
给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。
(2)输入输出描述:
输入:matrix =[[1,3,5,7],[10,11,16,20],[23,30,34,60]], target =3
输出:true
关键思路:
二分查找,遍历每行,每行使用二分查找
(2)代码块
classSolution{public:boolsearchMatrix(vector<vector<int>>& matrix,int target){int m = matrix.size();int n = matrix[0].size();int left,right,mid;for(int i =0;i<m;++i){
left =0;
right = n-1;if(matrix[i][0]> target)returnfalse;while(left<=right){
mid =(left+right)/2;if(matrix[i][mid]> target)right = mid-1;elseif(matrix[i][mid]< target)left = mid+1;elsereturntrue;}}returnfalse;}};