1、二分查找
二分查找的对象必须是有序表,最坏时间复杂度 O(logn),最好时间复杂度 O(1)
给定一个 n
个元素有序的(升序)整型数组 nums
和一个目标值 target
,写一个函数搜索 nums
中的 target
,如果目标值存在返回下标,否则返回 -1
。
题解
注意左右边界问题
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){
left=mid+1;
}else if(nums[mid]>target){
right=mid-1;
}else return mid;
}
return -1;
}
}
2、移除元素(双指针)
给你一个数组 nums
和一个值 val
,你需要 原地 移除所有数值等于 val
的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1)
额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
题解
双指针:low 和fast。先让low 和fast 都指向数组的开始,当nums[fast]==val时,fast 不给low 赋值,直接跳过去,当nums[fast]!=val 时,再将值赋给nums[low],low++;
主要还是一个跳过目标值,赋值的操作
class Solution {
public int removeElement(int[] nums, int val) {
int low=0;
for (int fast=0;fast<nums.length;fast++){
if(nums[fast]!=val){
nums[low]=nums[fast];
low++;
}
}
return low;
}
}
3、有序数组的平方
给你一个按 非递减顺序 排序的整数数组 nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
给你一个按 非递减顺序 排序的整数数组 nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
示例 1:
输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
题解
开辟一个新的数组。双指针,因为是非递减序列,通过判断左右两边的和来判断数的大小,将大的一方的数值给新的数组。
遇到的问题:
- 想不到开辟一个新数组解法
- 如果不开辟新数组直接用双指针的话,除了比较大小的问题,还有比较完之后指针的移动问题,赋值问题等等。
class Solution {
public int[] sortedSquares(int[] nums) {
int l=0,r=nums.length-1;
int k=r;
int [] res =new int [nums.length];
while(l<=r){
if(nums[l]+nums[r]<0){
res[k]=nums[l]*nums[l];
l++;
}else{
res[k]=nums[r]*nums[r];
r--;
}
k--;
}
return res;
}
}