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刷题笔记-数组的主要内容,如果未能解决你的问题,请参考以下文章