88. 合并两个有序数组
26. 删除排序数组中的重复项
303. 区域和检索 - 数组不可变
304. 二维区域和检索 - 矩阵不可变

88. 合并两个有序数组

  1. class Solution {
  2. public:
  3. void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
  4. int left = m-1,right = n-1;
  5. int sum = m + n - 1;
  6. while(left >= 0 || right >= 0){
  7. if(left < 0){
  8. nums1[sum--]=nums2[right--];
  9. }else if(right < 0){
  10. nums1[sum--]=nums1[left--];
  11. }else if(nums1[left]>nums2[right]){
  12. nums1[sum--]=nums1[left--];
  13. }else {
  14. nums1[sum--]=nums2[right--];
  15. }
  16. }
  17. }
  18. };

26. 删除排序数组中的重复项

题解

  1. class Solution {
  2. public:
  3. int removeDuplicates(vector<int> &nums) {
  4. if (nums.empty()) { return 0; }
  5. int k = 0;
  6. for (int i = 1; i < nums.size(); i++) {
  7. if (nums[i] != nums[k]) {
  8. k++;
  9. nums[k] = nums[i];
  10. }
  11. }
  12. return k + 1;
  13. }
  14. };

303. 区域和检索 - 数组不可变

  1. class NumArray {
  2. public:
  3. vector<int> sum;
  4. NumArray(vector<int> &nums) {
  5. sum = vector<int>(nums.size() + 1);
  6. for (int i = 0; i < nums.size(); i++) {
  7. //前缀和 预处理 都计算出来。
  8. sum[i + 1] = sum[i] + nums[i];
  9. }
  10. }
  11. int sumRange(int i, int j) {
  12. return sum[j + 1] - sum[i];
  13. }
  14. };

304. 二维区域和检索 - 矩阵不可变

  1. class NumMatrix {
  2. public:
  3. vector<vector<int>> sum;
  4. NumMatrix(vector<vector<int>> &matrix) {
  5. if(matrix.size()==0){
  6. return;
  7. }
  8. int M = matrix.size();
  9. // if(M > 0){
  10. int N = matrix[0].size();
  11. sum = vector<vector<int>>(M, vector<int>(N + 1));
  12. for (int i = 0; i < M; i++) {
  13. for (int j = 0; j < N; j++) {
  14. sum[i][j + 1] = sum[i][j] + matrix[i][j];
  15. }
  16. }
  17. }
  18. // }
  19. int sumRegion(int row1, int col1, int row2, int col2) {
  20. int ans = 0;
  21. for (int row = row1; row <= row2; row++) {
  22. ans += sum[row][col2 + 1] - sum[row][col1];
  23. }
  24. return ans;
  25. }
  26. };