数组理论基础:数组知识
704. 二分查找
代码:
class Solution {
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (target < nums[mid]) {
right = mid - 1;
}
else if (target > nums[mid]) {
left = mid + 1;
}
else {
return mid;
}
}
return -1;
}
}
27. 移除元素
个人方法 (有点繁琐)
代码
class Solution {
public int removeElement(int[] nums, int val) {
ArrayList<Integer> index = new ArrayList();
for (int i = 0; i < nums.length; i++) {
if (nums[i] == val) {
index.add(i);
}
}
if (index.size() == 1) {
if (index.get(0) == nums.length - 1) {
return nums.length - index.size();
}
for (int i = index.get(0) + 1; i < nums.length; i++) {
nums[i - 1] = nums[i];
}
} else if (index.size() > 1){
for (int i = 0; i < index.size() - 1; i++) {
int index1 = index.get(i);
int index2 = index.get(i + 1);
for (int j = index1 + 1; j < index2; j++) {
nums[j - i - 1] = nums[j];
}
}
if (index.get(index.size() - 1) != nums.length - 1) {
for (int i = index.get(index.size() - 1) + 1; i < nums.length; i++) {
nums[i - index.size()] = nums[i];
}
}
}
return nums.length - index.size();
}
}
- 时间复杂度:O(n^2)
- 空间复杂度:O(1)
暴力解法
代码
class Solution {
public int removeElement(int[] nums, int val) {
int len = nums.length;
for (int i = 0; i < len; i++) {
if (nums[i] == val) {
for (int j = i + 1; j < len; j++) {
nums[j - 1] = nums[j];
}
len--;
i--; //i得-1,否则会漏掉一个数
}
}
return len;
}
}
- 时间复杂度:O(n^2)
- 空间复杂度:O(1)
双指针
代码:
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)