#数组理论
(内容参考代码随想录)
数组是存放在连续内存空间上的相同类型数据的集合。
数组可以方便的通过下标索引的方式获取到下标对应的数据。
eg:字符数组
注意点:
- 数组的元素是不能删的,只能覆盖。
- 数组下标都是从0开始的。
- 数组内存空间的地址是连续的
eg:二维数组
#算法题目
LeetCode 704. 二分查找
给定一个 n
个元素有序的(升序)整型数组 nums
和一个目标值 target
,写一个函数搜索 nums
中的 target
,如果目标值存在返回下标,否则返回 -1
。
二分法第一种情况:
定义 target 是在一个在左闭右闭的区间里,也就是[left, right]
例如在数组:1,2,3,4,7,9,10中查找元素2
eg:
Code:
class Solution {
public int search(int[] nums, int target) {
int left=0;
int right=nums.length-1;
if (target < nums[left] || target > nums[right]){
return -1;
}
while (left<=right){
int mid=left+((right-left)>>1);
if(nums[mid]==target)
return mid;
else if (nums[mid]>target)
right = mid-1;
else if (nums[mid]<target)
left = mid+1;
}
return -1;
}
}
二分法第二种情况:
定义 target 是在一个在左闭右开的区间里,也就是[left, right)
例如在数组:1,2,3,4,7,9,10中查找元素2
eg:
Code:
class Solution {
public int search(int[] nums, int target) {
int left=0;
int right=nums.length-1;
if (target < nums[left] || target > nums[right]){
return -1;
}
while (left < right){
int mid=left+((right-left)>>1);
if(nums[mid]==target)
return mid;
else if (nums[mid]>target)
right = mid; // 主要区别,左闭右闭为right = mid -1
else if (nums[mid]<target)
left = mid+1;
}
return -1;
}
}
- 时间复杂度:O(log n)
- 空间复杂度:O(1)
LeetCode 27. 移除元素
给你一个数组 nums
和一个值 val
,你需要 原地 移除所有数值等于 val
的元素。元素的顺序可能发生改变。然后返回 nums
中与 val
不同的元素的数量。
假设 nums
中不等于 val
的元素数量为 k
,要通过此题,您需要执行以下操作:
- 更改
nums
数组,使nums
的前k
个元素包含不等于val
的元素。nums
的其余元素和nums
的大小并不重要。 - 返回
k
。
暴力解法:
class Solution {
public int removeElement(int[] nums, int val) {
int length = nums.length;
for (int i = 0; i < length; i++) {
if (nums[i] == val) { // 发现需要移除的元素,就将数组集体向前移动一位
for (int j = i + 1; j < length; j++) {
nums[j - 1] = nums[j];
}
i--; // 因为下标i以后的数值都向前移动了一位,所以i也向前移动一位
length--; // 此时数组的大小-1
}
}
return length;
}
}
- 时间复杂度:O(n^2)
- 空间复杂度:O(1)
双指针法:
1.快慢指针法: 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作
定义快慢指针
- 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
- 慢指针:指向更新 新数组下标的位置
eg:
Code:
class Solution {
public int removeElement(int[] nums, int val) {
int slowIndex=0;
for ( int fastIndex=0; fastIndex < nums.length; fastIndex++){
if (nums[fastIndex] != val){
nums[slowIndex]=nums[fastIndex];
slowIndex++;
}
}
return slowIndex;
}
}
- 时间复杂度:O(n)
- 空间复杂度:O(1)
开营第一天!继续消化相向双指针法!