乐趣区

关于leetcode:Leetcode刷题笔记数组

数组

int array[5]  
std::array<int,5> 倡议应用 std::array 代替简略数组,平安可保护

1. 数组下标都是从 0 开始
2. 数组内存空间的地址是间断且数组元素的类型雷同
3. 在删除或者削减元素的时候,就不免要挪动其余元素的地址
4. 在 C ++ 中二维数组是间断散布的,int array[2][3],
然而二维 vector 不是间断的 vector<vector<int>> matrix(2, vector<int>(3));

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;
    }
退出移动版