代码随想录-数组

代码随想录-数组

  • 数组
    • 预备知识
    • coding
      • day1
      • day2
    • 总结

数组

  1. 内存模型
  2. 常见的动态扩容策略
  3. stl常见的接口

预备知识

coding

day1

  • leetcode 704 二分查找
    1. 开、闭区间是针对查找范围来说的,例如[0, size - 1] 左右两侧都可以遍历到,为闭区间
    2. 需要清楚while的条件,结合区间,可以举单个元素的例子帮助理解
    3. 需要清楚right left重新赋值具体含义,结合区间进行判断,该位置有可能是目标值就不能-1、+1
class Solution {
public:
    int search(vector& nums, int target) {
        if(nums.empty()) return -1;
        int left = 0, right = nums.size() -1;
        while(left <= right){
            int mid = (right - left) / 2  + left;
            if(nums[mid] == target) return mid;
            if(nums[mid] > target){
                right = mid - 1;
            }else {
                left = mid + 1;
            }
        }
        return -1;
    }
};
  • leetcode 27 移除元素

这题可以变形为,将指定元素放到原数组最右侧。

class Solution {
public:
    int removeElement(vector& nums, int val) {
        int cnt = 0;
        for(size_t index = 0; index < nums.size(); ++index){
            if(val != nums[index]){
                nums[cnt++] = nums[index];
            }
        }
        return cnt;
    }
};

day2

  • 977 有序数组的平方
    经典
    vector sortedSquares(vector& nums) {
        // 排序后的数组,最大元素在最右侧; 原数组中最小的值在中间
        int left = 0, right = nums.size() - 1;
        std::vector ret = nums;
        int pos = right;
        while(left <= right){
            size_t left_val = nums[left]*nums[left];
            size_t right_val = nums[right]*nums[right];
            if(right_val < left_val){
                ret[pos] = left_val;
                ++left;
            }else{
                ret[pos] = right_val;
                --right;
            }
            --pos;
            
        }
        return ret;
    }
  • 209. 长度最小的子数组
    注意ret在循环内取值的时候是min 而不是 --ret
    int minSubArrayLen(int target, vector& nums) {
        int slow = 0, fast = 0, sum = 0;
        int ret = INT_MAX;
        while(fast < nums.size()){
            // 可以持续向右移动
            sum += nums[fast];
            //std::cout << "sum=" << sum << ",slow=" << slow << ",fast=" << fast << std::endl; 
            if( sum >= target){
                ret = std::min(ret, fast - slow + 1);
                // slow 向右移动
                sum -= nums[slow++];
                while(sum >= target){
                    ret = std::min(ret, fast - slow + 1);
                    sum -= nums[slow++];
                }
            }
            ++fast;
        }

        return ret == INT_MAX ? 0 : ret;
    }
  • 59. 螺旋矩阵 II
    模拟,需要注意中心元素或n=1的情况会不会漏
    vector> generateMatrix(int n) {
        int left = 0, right = n-1, up = 0, down = n - 1;
        int num = 1;
        std::vector> ret(n, std::vector(n));
        while(left <= right && up <= down){
            // 列从左到右
            int val = left;
            while(val <= right){
                ret[left][val++] = num++;
            }
            val = up+1;
            while(val < down){
                ret[val++][right] = num++;
            }

            val = right;
            while(val > left){
                ret[down][val--] = num++;
            }

            val = down;
            while(val > up){
                ret[val--][left] = num++;
            }

            left++;
            up++;
            right--;
            down--;
        }

        return ret;
    }

总结

你可能感兴趣的:(coding,数据结构)