[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]
起点坐标可知:因为多条路线首尾相连,所以下一个线段的起点为上一个线段的尾巴。
方向可知:总是按照向右、 向下、 向左、 向上循环切换。
位移可知:横向位移为矩阵的宽度、纵向位移为矩阵的高度,并且总是可以根据当前线段的方向,修正之后矩阵的参数。
横向:高度-1
纵向:宽度-1
总位移与矩阵的面积相等。
时间复杂度:O(N^2),其中 N 是输入矩阵所有元素的个数。
空间复杂度:O(N),存储结果集result。
输出: 7
输出: 1
输出: 5
class Solution {
public:
int calculate(string s) {
// 有个测试用例 int 型会超范围
long n = s.size(), num = 0, result = 0;
// 假设第一个运算符为+,即第一个数直接入栈
char op = '+';
stack<int> nums;
for(int i=0;i<n;++i){
// 是数字
if(s[i]>='0'){
num = num*10+s[i]-'0';
}
// 是运算符或最后一个数字
if((s[i]<'0'&&s[i]!=' ') || i==n-1){
if(op == '+') nums.push(num);
if(op == '-') nums.push(-num);
if(op == '*' || op == '/'){
int temp = (op == '*') ? nums.top()*num : nums.top()/num;
nums.pop();
nums.push(temp);
}
op = s[i];
num = 0;
}
}
// 计算结果
while(!nums.empty()){
result += nums.top();
nums.pop();
}
return result;
}
};
时间复杂度:O(N),其中 N 是输入矩阵所有元素的个数。
空间复杂度:O(N),主要是栈占用的容量。
输出: [0,1,1]
输出: [0,1,1,2,1,2]
class Solution {
public:
vector<int> countBits(int num) {
vector<int> res(num + 1);
res[0] = 0;
int n = num % 2 ? num - 1 : num;
for(int i = 1;i <= n;i++) {
res[i] = res[i-1] + 1;
i++;
res[i] = res[i / 2];
}
if(num % 2)
res[num] = res[n] + 1;
return res;
}
};
时间复杂度: O(N),其中 N 为给定整数num。
空间复杂度:O(N),其中 N 为给定整数num。
第一步:先和面试官沟通下题目的细节和边界条件,确保自己理解是正确的
第二步:想所有可能的解法,比较各种不同方法的时空复杂度,不要只想一种就开始写
第三步:开始写简洁的代码,注重编码习惯和Code Style
第四步:选择多种测试样例考察边缘情况
7天入门数据结构与算法,仅需 ¥9.9
覃超老师会从 LeetCode 海量题库中,给你精选出最值得练习、最高频出现的算法题
来自一线互联网企业的助教老师每天在群内为你答疑,
配备专属班主任全程带班,打造高效学习社群,收获学习伙伴
往期优秀老学员分享,传递给你高效的学习方式和最精华的知识点总结
限时特惠仅需 ¥9.9。
注意,报名后,务必添加班主任微信,加入班级社群。