Day1
数组理论基础
- 数组下标都是从0开始的。
- 数组内存空间的地址是连续的。
正是因为数组在内存空间的地址是连续的,所以我们在删除或者添加元素的时候,就难免要移动其他元素的地址。
- 数组元素是不能删的,只能覆盖
二维数组
- C++中二维数组在地址空间上是连续的。
- Java中二维数组在地址空间上没有明确的规则。
704.二分查找
左闭右闭
class Solution {
public int search(int[] nums, int target) {
int n = nums.length;
int l = 0, r = n - 1;
int mid = 0;
while (l <= r) {
mid = (l + r) / 2;
if (nums[mid] > target) r = mid - 1;
else if (nums[mid] < target) l = mid + 1;
else return mid;
}
return -1;
}
}
左闭右开
class Solution {
public int search(int[] nums, int target) {
int n = nums.length;
int l = 0, r = n;
int mid = 0;
while (l < r) {
mid = (l + r) / 2;
if (nums[mid] > target) r = mid;
else if (nums[mid] < target) l = mid + 1;
else return mid;
}
return -1;
}
}
找右边界
class Solution {
public int search(int[] nums, int target) {
int n = nums.length;
int l = 0, r = n - 1;
int mid = 0;
while (l < r) {
mid = (l + r) / 2 + 1;
if (nums[mid] <= target) l = mid;
else r = mid - 1;
}
return nums[l] == target ? l : -1;
}
}
找左边界
class Solution {
public int search(int[] nums, int target) {
int n = nums.length;
int l = 0, r = n - 1;
int mid = 0;
while (l < r) {
mid = (l + r) / 2;
if (nums[mid] >= target) r = mid;
else l = mid + 1;
}
return nums[l] == target ? l : -1;
}
}
27.移除元素
暴力解法
class Solution {
public int removeElement(int[] nums, int val) {
int n = nums.length;
for(int i = 0; i < n; i++) {
if (nums[i] == val) {
for (int j = i; j < n - 1; j++) {
nums[j] = nums[j + 1];
}
i--;
n--;
}
}
return n;
}
}
双指针法
class Solution {
public int removeElement(int[] nums, int val) {
int n = nums.length;
int slow = 0;
for (int fast = 0; fast < n; fast++) {
if (nums[fast] != val) {
nums[slow++] = nums[fast];
}
}
return slow;
}
}