数组
二分查找
- 前提
- 有序数组
- 要点
- 区间的边界、开闭 -> 循环结束条件
- 区间的移动方式 -> right/left的赋值
int search(int* nums, int numsSize, int target) {
if (numsSize <= 0)
return -1;
int left = 0;
int right = numsSize - 1;
int middle =0;
while(left <= right)
{
middle = (right + left)/2;
if(target == nums[middle])
return middle;
else if(target < nums[middle])
{
right = middle - 1;
}
else
{
left = middle + 1;
}
}
return -1;
}
移除元素
- 前提
- 直接修改原数组,传入指针(数组地址)
- 返回新数组长度,不用处理新数组长度后面的元素
- 要点
- 双指针法将时间复杂度减为O(n)
暴力解法
int removeElement(int* nums, int numsSize, int val) {
int i,j;
int len = numsSize;
for (i = 0; i < len;){
if (nums[i] == val){
for (j = i; j < len-1; j++){
nums[j] = nums[j+1];
}
len--;
}
else
i++;
}
return len;
}
!双指针法
同向快慢指针
int removeElement(int* nums, int numsSize, int val) {
int slowIndex = 0;
for (int fastIndex = 0; fastIndex < numsSize; fastIndex++){
if (nums[fastIndex] != val){
nums[slowIndex++] = nums[fastIndex];
}
}
return slowIndex;
}