You are given a 1-indexed array of distinct integers nums
of length n
.
You need to distribute all the elements of nums
between two arrays arr1
and arr2
using n
operations. In the first operation, append nums[1]
to arr1
. In the second operation, append nums[2]
to arr2
. Afterwards, in the ith operation:
If the last element of arr1
is greater than the last element of arr2
, append nums[i]
to arr1
. Otherwise, append nums[i]
to arr2
.
The array result
is formed by concatenating the arrays arr1
and arr2
. For example, if arr1 == [1,2,3]
and arr2 == [4,5,6]
, then result = [1,2,3,4,5,6]
.
Return the array result
.
Input: nums = [2,1,3]
Output: [2,3,1]
Explanation: After the first 2 operations, arr1 = [2] and arr2 = [1].
In the 3rd operation, as the last element of arr1 is greater than the last element of arr2 (2 > 1), append nums[3] to arr1.
After 3 operations, arr1 = [2,3] and arr2 =[1].
Hence, the array result formed by concatenation is [2,3,1].
Input: nums = [5,4,3,8]
Output: [5,3,4,8]
Explanation: After the first 2 operations, arr1 = [5] and arr2 = [4].
In the 3rd operation, as the last element of arr1 is greater than the last element of arr2 (5 > 4), append nums[3] to arr1, hence arr1 becomes [5,3].
In the 4th operation, as the last element of arr2 is greater than the last element of arr1 (4 > 3), append nums[4] to arr2, hence arr2 becomes [4,8].
After 4 operations, arr1 = [5,3] and arr2 = [4,8].
Hence, the array result formed by concatenation is [5,3,4,8].
3 <= n <= 50
1 <= nums[i] <= 100
nums
are distinct.class Solution {
public:
vector<int> resultArray(vector<int>& nums) {
vector<int> arr1, arr2;
arr1.push_back(nums[0]);
arr2.push_back(nums[1]);
for (auto i = 2; i < nums.size(); i++) {
if (arr1.back() > arr2.back()) {
arr1.push_back(nums[i]);
} else {
arr2.push_back(nums[i]);
}
}
vector<int> result;
result.insert(result.end(), arr1.begin(), arr1.end());
result.insert(result.end(), arr2.begin(), arr2.end());
return result;
}
};
个人思路:基本上按照题目顺序下来的,先将一个数组按要求拆成两个再合并。
看了灵神的代码,是真的清爽!
class Solution {
public:
vector<int> resultArray(vector<int>& nums) {
vector<int> a{nums[0]}, b{nums[1]};
for (int i = 2; i < nums.size(); i++) {
(a.back() > b.back() ? a : b).push_back(nums[i]);
}
a.insert(a.end(), b.begin(), b.end());
return a;
}
};
You are given a 0-indexed integer matrix grid
and an integer k
.
Return the number of submatrices
that contain the top-left element of the grid
, and have a sum less than or equal to k
.
A submatrix
x1
,y1
,x2
,y2
is the set of all cellsmatrix[x][y]
with
x1 <= x <= x2
andy1 <= y <= y2
.
Input: grid = [[7,6,3],[6,6,1]], k = 18
Output: 4
Explanation: There are only 4 submatrices, shown in the image above, that contain the top-left element of grid, and have a sum less than or equal to 18.
Input: grid = [[7,2,9],[1,5,0],[2,6,6]], k = 20
Output: 6
Explanation: There are only 6 submatrices, shown in the image above, that contain the top-left element of grid, and have a sum less than or equal to 20.
m == grid.length
n == grid[i].length
1 <= n, m <= 1000
0 <= grid[i][j] <= 1000
1 <= k <= 109
class Solution {
public:
int countSubmatrices(vector<vector<int>> &grid, int k) {
int ans = 0, m = grid.size(), n = grid[0].size();
vector<vector<int>> sum(m + 1, vector<int>(n + 1));
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
sum[i + 1][j + 1] = sum[i + 1][j] + sum[i][j + 1] - sum[i][j] + grid[i][j];
ans += sum[i + 1][j + 1] <= k;
}
}
return ans;
}
};