代码随想录训练营-数组part01
数组理论
内存存储方式: 数组是连续的内存空间内存储相同类型元素的集合
数组获取元素的方式: 通过索引来进行获取,索引下表取值范围[0,array.length-1] 例如array[0] 数组数据存储的优缺点:- 数组元素查找较为方便,可通过遍历或下标来进行获取;
- 因为存取方式是连续的,所以增删元素场景下,需移动其他相关元素,时间复杂度高
二维数组:
- 二维数组的表示类型为array[行索引][列索引]
- c++中二维数组为连续存储,每个相邻元素地址为对应数据类型所占字节数 例如 int类型数组,相邻元素内存地址相差4个字节,即为4
- java中内存寻址有jvm虚拟机操作
704-二分查找
二分查找的规律:
二分查找特征为左右两个指针同时进行遍历; 当右指针小于左指针时代表遍历结束; 优缺点分析- 优点:
- 遍历速度快时间复杂度低O(logn);
- 空间复杂度低 O(1)
- 缺点:
- 限制较强,查找比较依赖有序数组
- 在有序不重复数组中适用性强
解题思路---704. 二分查找
-
关键词 有序 数组 搜索
-
进行区间划分 确认区间为[left,right] 或 [left,right)
-
若选择[left,right]
class Solution { public int search(int[] nums, int target) { // 二分查找就是左右双指针遍历 // 左右指针对应值与目标值进行对比 此时存在易错点 左右值与目标值对比 // 获取中间指针,此时存在易错点 区间如何?中间指针如何保证取值是整数,此时应该以开闭空间来进行讨论 int leftPoint = 0; // 闭区间写法[left,right] int rightPoint = nums.length -1; int result = -1; // 判别式取值<= 是因为要考虑仅有一个元素的场景,此时nums[middle]为本身 // 闭区间写法[left,right] while(leftPoint <= rightPoint){ // 向下取整 int middle = (rightPoint - leftPoint)/2 + leftPoint; if(nums[middle] == target){ result = middle; break; }else if(nums[middle] < target){ leftPoint = middle + 1; // 闭区间[left,right] }else{ rightPoint = middle - 1;// 闭区间[left,right] } } return result; } } -
若选择[left,right)
class Solution { public int search(int[] nums, int target) { // 二分查找就是左右双指针遍历 // 左右指针对应值与目标值进行对比 此时存在易错点 左右值与目标值对比 // 获取中间指针,此时存在易错点 区间如何?中间指针如何保证取值是整数,此时应该以开闭空间来进行讨论 int leftPoint = 0; // 闭区间写法[left,right] int rightPoint = nums.length -1; int result = -1; // 判别式取值<= 是因为要考虑仅有一个元素的场景,此时nums[middle]为本身 // 闭区间写法[left,right] while(leftPoint <= rightPoint){ // 向下取整 int middle = (rightPoint - leftPoint)/2 + leftPoint; if(nums[middle] == target){ result = middle; break; }else if(nums[middle] < target){ leftPoint = middle + 1; // 闭区间[left,right] }else{ rightPoint = middle - 1;// 闭区间[left,right] } } return result; } }
27-移除元素
- 关键词
- 数组
- 空间复杂度限制
- 指定元素删除
- 解题思路
- 空间复杂度限制并且要进行数组的增删操作
- 考虑快慢指针,慢指针代表待更新的元素,快指针代表替换元素
- 返回数组的长度可以取最后一次更改慢指针的索引数值+1
class Solution {
/**
思考: 快慢指针处理,
定义一个慢指针 slowPoint 初始为0
i循环快指针fastPoint 初始为0,每次循环 若快指针对应元素不为val则赋值给慢指针,同时慢指针移动一位,最后返回的慢指针的下表即为最终数组的长度
*/
public int removeElement(int[] nums, int val) {
int slowPoint = 0;
// 若只有一个元素,当为val时 slowpoint依然为0
// 只有一个元素,不为val时 nums[0] = nums[0] 此时slowpoint会右移一位,成为1
for(int quickPoint = 0 ; quickPoint <= nums.length - 1 ; quickPoint++){
if(nums[quickPoint] != val){
nums[slowPoint] = nums[quickPoint];
slowPoint ++;
}
}
return slowPoint;
}
}