Leetcode刷题笔记-数组

Posted ysysys

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode刷题笔记-数组相关的知识,希望对你有一定的参考价值。

数组

int array[5]  
std::array<int,5> arr; 建议使用std::array替代简单数组,安全可维护,与vector最大的区别是定长
std::vector<int> arr(5);

1.数组下标都是从0开始
2.数组内存空间的地址是连续且数组元素的类型相同
3.在删除或者增添元素的时候,就难免要移动其他元素的地址
4.在C++中
二维数组并不全连续,只有每条是连续的,int array[2][3],
array<array<int, 100>, 100> arr
二维vector也不是连续的 vector<vector<int>> matrix(2, vector<int>(3, 0));

35-搜索插入位置-二分查找

  • 有序数组,都可以想一想是否可以使用二分法
  • 「循环不变量原则」,只有在循环中坚持对区间的定义,才能清楚的把握循环中的各种细节。
  • 此处采用左闭右开的写法,也就是[left, right)

    //O(logn) + O(1)
    int searchInsert(vector<int>& nums, int target) {
      int n = nums.size();
      int left = 0;
      int right = n; // 定义target在左闭右开的区间里,[left, right)  target
      while (left < right) { // 因为left == right的时候,在[left, right)是无效的空间
          int middle = ((right + left) >> 1);
          if (nums[middle] > target) {
              right = middle; // target 在左区间,在[left, middle)中
          } else if (nums[middle] < target) {
              left = middle + 1; // target 在右区间,在 [middle+1, right)中
          } else { // nums[middle] == target
              return middle; // 数组中找到目标值的情况,直接返回下标
          }
      }
      // 分别处理如下四种情况
      // 目标值在数组所有元素之前 [0,0)
      // 目标值等于数组中某一个元素 return middle
      // 目标值插入数组中的位置 [left, right) ,return right 即可
      // 目标值在数组所有元素之后的情况 [left, right),return right 即可
      return right;
    }

27-移除元素-快慢指针

    int removeElement(vector<int>& nums, int val) {
        //[3, 1, 2, 4, 6, 8, 2, 9, 0] val = 2
        //[3, 1, 4, 6, 8, 9, 0]
        int slow_idx = 0;
        for(int i = 0; i < nums.size() ++i){
            if(nums[i] != val){
                nums[slow_idx++] = nums[i];
            }
        }
    }

209-长度最小的子数组-滑动窗口

  • 滑动窗口算法可以用以解决数组/字符串的子元素问题,它可以将嵌套的循环问题,转换为单循环问题,降低时间复杂度。

    int minSubArrayLen(int target, vector<int>& nums) {
      //[2,3,1,2,4,3] target = 7
      //init  i = 0; j = 0; sum = 2;
      //step1 i = 0; j = 1; ->sum = 5 < 7; j++;
      //step2 i = 0; j = 2; ->sum = 6 < 7; j++;
      //step3 i = 0; j = 3; ->sum = 8 > 7; i++; subLength = 4;
      //step4 i = 1; j = 3; ->sum = 6 < 7; j++;
      //step5 i = 1; j = 4; ->sum = 10 > 7; i++; subLength = 4;
      //step6 i = 2; j = 4; ->sum = 7 = 7; i++; subLength = 3;
      //step7 i = 3; j = 4; ->sum = 6 < 7; j++;
      //step8 i = 3; j = 5; ->sum = 9 > 7; j++(x) i++(o); subLength = 3;
      //step9 i = 4; j = 5; ->sum = 7 = 7; j++(x) i++(o); subLength = 2;
      //step10 i = 5; j = 5; ->sum = 3 < 7; j++(x) i++(x);   
      int i = 0;
      int result = INT_MAX;
      int subLength = 0;
      int sum = 0;
      for(int j = 0; j < nums.size(); ++j){
          sum += nums[j];
          while(sum >= target){
              subLength = j - i + 1;
              result = min(subLength, result);
              sum -= nums[i++];
              //i++;
          }
      }
      return result == INT_MAX? 0 : result;
    }

59-螺旋矩阵 II

  • 这题能把初学者整疯。

以上是关于Leetcode刷题笔记-数组的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode刷题笔记-动态规划-day6

LeetCode刷题笔记-动态规划-day5

LeetCode刷题笔记-动态规划-day5

LeetCode刷题笔记-动态规划-day5

LeetCode刷题笔记-数据结构-day20

LeetCode刷题笔记-数据结构-day15