算法题——数组
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)/2;if(nums[mid]==target) return mid;else if(nums[mid]>target){right=mid-1;}else{left=mid+1;}}return -1;}
}
二分查找只适用于有序数组,这里要注意循环的边界,以及每次更新边界的值
27.移除元素
class Solution {public int removeElement(int[] nums, int val) {int slow=0;int fast=0;for(;fast<nums.length;fast++){if(nums[fast]!=val){nums[slow++]=nums[fast];}}return slow;}
}
大部分数组的题考察的是双指针法甚至是多指针,这里采用快慢指针,快指针用于遍历整个数组,遍历过程中判断其值是否等于val,慢指针用于记录目标数组的索引(这里不要求得到新数组,所以在原数组上赋值即可)
977.有序数组的平方
class Solution {public int[] sortedSquares(int[] nums) {int[] res = new int[nums.length];int left=0;int right=nums.length-1;for(int i=res.length-1;i>=0;i--){int num1 = nums[left]*nums[left];int num2 = nums[right]*nums[right];if(num1 < num2){res[i] = num2;right--;}else{res[i] = num1;left++;}}return res;}
}
同样是双指针法,这里的思想是碰撞指针,一个指针定义在最左边,一个指针定义在最右边,由于最大的平方数只有可能在两边产生,因此比较二者的较大值,将其赋值给结果数组,注意要从后往前赋值,这样才能保证非递减排序