今天课比较多,刚好没安排多少题,稍微记录一下。
2789. 合并后数组中的最大元素 题目描述:
给你一个下标从 0 开始、由正整数组成的数组 nums
。
你可以在数组上执行下述操作 任意 次:
-
- 选中一个同时满足
0 <= i < nums.length - 1
和nums[i] <= nums[i + 1]
的整数i
。将元素nums[i + 1]
替换为nums[i] + nums[i + 1]
,并从数组中删除元素nums[i]
。
- 选中一个同时满足
返回你可以从最终数组中获得的 最大 元素的值。
示例:
输入:nums = [2,3,7,9,3] 输出:21 解释:我们可以在数组上执行下述操作: - 选中 i = 0 ,得到数组 nums = [5,7,9,3] 。 - 选中 i = 1 ,得到数组 nums = [5,16,3] 。 - 选中 i = 0 ,得到数组 nums = [21,3] 。 最终数组中的最大元素是 21 。可以证明我们无法获得更大的元素。
本题不是很难,自己琢磨了一会儿也做出来了。
我们直接从数组结尾往前遍历遇到nums[i] >= nums[i – 1]时就可以将nums[i]加到nums[i – 1]中。但是需要注意原函数给的是int类型的,到了后面的案例会给两数相加超出int范围的数,所以我们可以创建一个long long类型的数组把原数组放入其中之后再进行运算。
class Solution {
public:
long long maxArrayValue(vector<int>& nums) {
if (nums.size() == 1) return nums[0];
long long result = 0;
vector<long long> used;
for (int i = 0; i < nums.size(); i++){
used.push_back(nums[i]);
}
for (int i = used.size() - 1; i >= 0; i--){
if (i > 0 && used[i] >= used[i - 1]){
used[i - 1] += used[i];
}
result = result > used[i] ? result : used[i];
}
return result;
}
};
但这样子还是太麻烦了,我们可以直接定义一个long long类型的数来存放这个和。如果这个和小与下一个要遍历的数,那么就将这个和值赋为下一个遍历的值。
class Solution {
public:
long long maxArrayValue(vector<int>& nums) {
long long sum = nums[nums.size() - 1];
for (int i = nums.size() - 2; i >= 0; i--){
sum = nums[i] <= sum ? sum + nums[i] : nums[i];
}
return sum;
}
};
73. 矩阵置零 题目描述:
给定一个 m x n
的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。
示例:
输入:matrix = [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]
看到这题时我我还天真地以为遍历遇到0就把那一行那一列置零就好了,但是这样子就无法判断那些被置零的位置原本是不是0了,就可能少置零了几行几列。
这里给出的方法是先遍历找出值为0的点,将其所在的位置对应的第一行和第一列标记成0,但是如果原本的第一行第一列的这个位置原本就是0会影响了第一行第一列的判断,所以我们需要先遍历第一行和第一列判断是否有0,如果有0的话,再最后就可以直接将其那一行列全置为零。
bool row = false, col = false;
for (int i = 0; i < matrix.size(); i++){
if (matrix[i][0] == 0){
col = true;//如果遍历到0就说明这一列全都要置为零,不用再遍历下去了
break;
}
}
for (int j = 0; j < matrix[0].size(); j++){
if (matrix[0][j] == 0){
row = true;
break;
}
}
接下来我们就可以寻找除了第一行第一列之外的中间位置中的0了,如果遇到了0,就可以把那一行那一列的第一个位置的值置为零作为标记
for (int i = 1; i < matrix.size(); i++){
for (int j = 1; j < matrix[0].size(); j++){
if (matrix[i][j] == 0){
matrix[i][0] = 0;//该位置第一列对应的位置置零
matrix[0][j] = 0;//该位置第一行对应的位置置零
}
}
}
接下来我们就可以开始置零操作了
for (int i = 1; i < matrix.size(); i++){//遍历第一行,不管是原本就是0还是由于标记置零的,都可以将这个0对应的列全部置为零
if (matrix[i][0] == 0){
for (int j = 1; j < matrix[0].size(); j++){
matrix[i][j] = 0;
}
}
}
for (int j = 1; j < matrix[0].size(); j++){
if (matrix[0][j] == 0){
for (int i = 1; i < matrix.size(); i++){
matrix[i][j] = 0;
}
}
}
最后再由一开始判断好的第一行第一列是否原本就有0,来决定第一行第一列是否置零
if (row == true){
for (int j = 0; j < matrix[0].size(); j++){
matrix[0][j] = 0;
}
}
if (col == true){
for (int i = 0; i <matrix.size(); i++){
matrix[i][0] = 0;
}
}