本文链接:https://blog.csdn.net/qq_34811382/article/details/112757930
43.字符串相乘
思路:
模拟真实乘法,不过先不进位,最后统一进位。
代码:
class Solution
{
public:
string multiply(string num1, string num2)
{
string result = "";
if (num1 == "0" || num2 == "0")
return "0";
int s1 = num1.size(), s2 = num2.size();
vector<int> ans(s1 + s2, 0);
reverse(num1.begin(),num1.end());
reverse(num2.begin(),num2.end());
for (int i = 0; i < s1; i++)
{
for (int j = 0; j < s2; j++)
{
ans[i + j] += (num1[i] - '0') * (num2[j] - '0');
}
}
for (int k = 0; k < s1 + s2; k++)
{
if (ans[k] > 9)
{
ans[k + 1] += (ans[k] / 10);
ans[k] %= 10;
}
}
int end = (ans[s1 + s2 - 1] == 0 ? s1 + s2 - 2 : s1 + s2 - 1);
for (; end>=0; --end)
{
result += (ans[end] + '0');//这里就是代替反转。
}
return result;
}
};
46.全排列
思路:回溯算法
53.最大子序列
思路一:暴力算法
时间复杂度O(N^2)。利用两个指针来找到最大的子序列。
代码:
//暴力法
class Solution
{
public:
int maxSubArray(vector<int> &nums)
{
int res = INT_MIN;
int max = INT_MIN;
for (int i = 0; i < nums.size(); i++)
{
for (int j = i; j < nums.size(); j++)
{
max += nums[j];
if (res < max)
{
res = max;
}
}
}
return max;
}
};
思路二:
贪心算法,从左向右迭代,如果sum<=0,重新查找子序列。当sum>0时,不断比较sum与结果中找到最大的。
代码:
class Solution
{
public:
int maxSubArray(vector<int> &nums)
{
int res = INT_MIN;
int sum = 0;
for (int i = 0; i < nums.size(); i++)
{
sum += nums[i];
res = max(sum, res);
if (sum <= 0)
{
sum = 0;
}
}
return res;
}
};