数组内容复习
- 定义格式:数据类型[] 变量名
int[] arr
数据类型 变量名[]int arr[]
数组是存放在连续内存空间上的相同类型数据的集合
- 数组的下标是从零开始的
- 数组的内存空间地址是连续的
- 数组的元素不可以删除,只能覆盖
-
动态初始化:数据类型[] 变量名 = new 数据类型[数组长度];
Int[] arr = new int[3];
new:为数组申请内存空间
静态初始化:初始化时指定每个数组元素的初始值,有系统决定组长度
格式:数据类型[] 变量名={数据1,数据2,数据3…}Int[] arr={1,2,3,,,}
数组初始化时,会为存储空间添加默认值0/0.00/null -
数组元素访问:
变量访问方式:数组名[索引]
索引的特征:从0开始;连续;每次加1
-
内存分配:内存地址 数据
栈内存:存储局部变量 局部变量:定义在方法中的变量arr,使用完就会消失
堆内存:存储new出来的内容(实体、对象)
-
常见问题:数组越界;空指针异常
-
数组常见操作:获取最值:①定义一个变量用于保存最值;②取数组中第一个数据作为变量的初始值;③与数组中剩余的数据逐个比对;④打印结果
704. 二分查找
给定一个
n
个元素有序的(升序)整型数组nums
和一个目标值target
,写一个函数搜索nums
中的target
,如果目标值存在返回下标,否则返回-1
。
输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
- 二分查找原理:
- 设置查找区间:low = 0;high= arr.length-1;
- 若查找区间[low, high]不存在,则查找失败;否则转下一步骤
- 取中间位mid = (low + high) / 2;比较 target 与 arr[mid],有以下三种情况:
①若 target < arr[mid],则high = mid - 1;查找在左半区间进行,转步骤2;
②若 target > arr[mid],则low = mid + 1;查找在右半区间进行,转步骤2;
③若 target = arr[mid],则查找成功,返回 mid 值;
public int BinarySearch(int[] numbers,int target){
int low=0;
int height=numbers.length-1;
int index=0;
while(low<=height){
int mid=(low+height)/2;
if(numbers[mid]==target){
return mid;
}else if(numbers[mid]>target){
height=mid-1;
}else if(numbers[mid]<target){
low=mid+1;
}
}
return -1;
}
27. 移除元素
给你一个数组
nums
**和一个值val
,你需要 原地 移除所有数值等于val
**的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用O(1)
额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。
你不需要考虑数组中超出新长度后面的元素。
例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3]
或 nums = [2,2,0,0],也会被视作正确答案。
-
双指针法
通过一个快指针(fast)和慢指针(slow)在一个for循环下完成两个for循环的工作
public int RemoveElement(int[] arr,int val){
int slow=0;
for(int fast=0;fast<arr.length;fast++){
if(arr[fast]!=val){
arr[slow]=arr[fast];
slow++;
}
}
return slow;
}
DAY1总结:
- 数组不可以删除,只能覆盖,所以对于数组中移除某元素可以利用双指针,快慢指针一起出发,当遇到目标值快指针向前走,将快指针遍历的值赋值给慢指针,最后返回慢指针。
- 二分查找主要是判断中间值(mid)和目标值进行判断,逐渐缩小目标区域。
- 对于数组的处理要切记索引从0开始,删除数据善用双指针。
今天的题目之前都做过,但是之前总是会参考别人的代码,形成的都是瞬时记忆,再次来做还是会忘记很多细节,希望之后可以独立思考,提高训练的效率,而不是一遍又一遍的忘记,未来可期,继续加油!菜鸟逐步努力当中……