代码随想录-数组

代码随想录-数组

数组

  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<int>& 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;
    }
};

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

class Solution {
public:
    int removeElement(vector<int>& 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

    vector<int> sortedSquares(vector<int>& nums) {
        // 排序后的数组,最大元素在最右侧; 原数组中最小的值在中间
        int left = 0, right = nums.size() - 1;
        std::vector<int> 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;
    }
    int minSubArrayLen(int target, vector<int>& 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;
    }
    vector<vector<int>> generateMatrix(int n) {
        int left = 0, right = n-1, up = 0, down = n - 1;
        int num = 1;
        std::vector<std::vector<int>> ret(n, std::vector<int>(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;
    }

总结

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值