数组
数组是存放在连续内存空间上的相同类型数据的集合。
- 数组在内存的的伪示例:
Note
- 数组下标都是从0开始的
- 数组内存空间的地址是连续的 所以查找比较快 但是删除插入 比较慢
例如在下面数组中删除元素C
删除前
| 内存地址 | 100 | 101 | 102 | 103 | 104 | 105 | 106 |
|---|---|---|---|---|---|---|---|
| data | A | B | C | D | E | F | G |
| 下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
删除后
| 内存地址 | 100 | 101 | 102 | 103 | 104 | 105 | 106 |
|---|---|---|---|---|---|---|---|
| data | A | B | D | E | F | G | null |
| 下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
binary search
// left Close Right Close
public int search(int[] nums, int target) {
if (nums.length <= 0) {
return -1;
}
int left = 0;
// because right is close so here right can use nums.length-1
int right = nums.length - 1;
// here riht == left
while (left <= right) {
int middle = left + (right - left) / 2;
if (nums[middle] == target) {
return middle;
}
if (nums[middle] > target) {
right = middle - 1;
} else {
left = middle + 1;
}
}
return -1;
}
//Left Close Right Open
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length; // because right is open so here right can use nums.length
while (left < right) {
int middle = left + (right - left) / 2;
if (nums[middle] == target) {
return middle;
}
if (nums[middle] > target) {
right = middle;
} else {
left = middle + 1;
}
}
return -1;
}
search insert position
public int searchInsert(int[] nums, int target) {
final int length = nums.length;
int left = 0;
int right = length - 1;
//default insert in the array right
int result = length;
while (left <= right) {
int middle = left + (right - left) / 2;
if (target <= nums[middle]) {
result = middle;
right = middle - 1;
} else {
left = middle + 1;
}
}
return result;
}
remove element
public int removeElement(int[] nums, int target) {
int left = 0;
int right = nums.length;
while (left < right) {
if (nums[left] == target) {
//right element direct replace left element
nums[left] = nums[right - 1];
right--;
} else {
// loop next element
left++;
}
}
return left;
}