704 二分查找
易错点:开闭区间,这里用的是左闭右闭区间
class Solution {
public int search(int[] nums, int target) {
if (nums[0] > target || nums[nums.length-1]<target) {
return -1;
}
int left = 0, right = nums.length - 1;
while (left <= right) {
int mid = (right+left)/2;
int num = nums[mid];
if (num == target) {
return mid;
} else if (target > num){
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1; //未找到目标值
}
}
27 移除元素
暴力的解法:两层for循环,一个for循环遍历数组元素 ,第二个for循环更新数组,但是时间复杂度为O(n^2),比较高
需要重点掌握的是双指针法,时间复杂度为O(1):
双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
定义快慢指针
- 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
- 慢指针:指向更新 新数组下标的位置
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;
}
}
977 有序数组的平方
双指针法的应用,比暴力解法的效果好
数组其实是有序的, 只不过负数平方之后可能成为最大数了。那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。
因此可以考虑双指针法了,i指向起始位置,j指向终止位置。
定义一个新数组result,和A数组一样的大小,让k指向result数组终止位置。
class Solution {
public int[] sortedSquares(int[] nums) {
int left=0, right=nums.length-1;
int[] result= new int[nums.length];
int index= nums.length-1;
while(left<=right){
if(nums[left]*nums[left]>nums[right]*nums[right]){
result[index]=nums[left]*nums[left];
index--;
left++;
} else{
result[index]=nums[right]*nums[right];
index--;
right--;
}
}
return result;
}
}

1054

被折叠的 条评论
为什么被折叠?



