数组理论知识
文档讲解:https://programmercarl.com/%E6%95%B0%E7%BB%84%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html
-
数组的元素不能删除,只能覆盖
-
行是第一索引,列是第二索引
-
Java是没有指针的,同时也不对程序员暴露其元素的地址,寻址操作完全交给虚拟机,所以看不到每个元素的地址情况。
704 二分查找
文档讲解:https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html
视频讲解:https://www.bilibili.com/video/BV1fA4y1o715
LeetCode题目:https://leetcode.cn/problems/binary-search/
思路:
有两种写法:左闭右闭即[left, right],左闭右开即[left, right)
第一种:定义target在[left, right]区间
- while (left <= right) 要使用 <=,因为[1,1]是有意义的;
- if (nums[middle] > target) ,right 要赋值为 middle - 1,因为是闭区间,middle已经比较过了。
第二种:定义target在[left, right)区间
- while (left <right) 要使用 <,因为[1,1)是没意义的;
- if (nums[middle] > target) ,right 要赋值为 middle,因为是开区间,middle还没比较过
代码:
方法一:左闭右闭即[left, right]
class Solution {
public int search(int[] nums, int target) {
if(target < nums[0] || target > num[nums.length-1]) return -1;
int left = 0, right = nums.length-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{ //nums[mid] < target
left = mid+1;
}
}
//未找到目标值
return -1;
}
}
方法二:左闭右开即[left, right)
class Solution {
public int search(int[] nums, int target) {
int left = 0, right= nums.length;
if(nums[0]>target || nums[nums.length-1]<target) return -1;
while(left<right){
int mid = left + ((right - left) >>1);
if (nums[mid] == target) return mid;
else if (nums[mid]>targer){
right = mid;
}
else { //nums[mid] < target
left = mid+1;
}
}
//未找到目标值
return -1;
}
}
需要注意点:
1、边界的处理
2、比较一轮后,边界指针放在middle的哪里
在这段代码中,(right - left)>>1 表示计算(left和right之间的距离)除以2的结果。这个操作通常用于计算中间值,以便在二分查找算法中确定下一个比较的位置。
- 时间复杂度:O(log n)
- 空间复杂度:O(1)
27 移除元素
文档讲解:https://programmercarl.com/0027.%E7%A7%BB%E9%99%A4%E5%85%83%E7%B4%A0.html
视频讲解:https://www.bilibili.com/video/BV12A4y1Z7LP
LeetCode题目:https://leetcode.cn/problems/remove-element/
思路:
有两种写法:暴力解法、双指针法(快慢指针法)
暴力解法:两层for循环
双指针法:通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
- 快指针:寻找数组中符合标准的元素
- 慢指针:快指针找到之后,将结果赋给慢指针
代码:
class Solution {
public int removeElement(int[] nums, int val) {
int slowIndex = 0;
for(fastIndex=0; fastIndex<num.length; fastIndex++){
if(nums[fastIndex]!==val){
nums[slowIndex] = nums[fastIndex];
slowIndex ++;
}
}
return slowIndex;
}
}
需要注意点:
也可以用双向指针,left和right,left找到之后将right赋给left,left++,最后返回left的值,就是新数组的长度。
- 时间复杂度:O(n)
- 空间复杂度:O(1)