day1 |704.二分查找、27.移除元素
题目描述:
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
代码:
class Solution {
public int search(int[] nums, int target) {
int low=0, high=nums.length-1;
while(low<=high){
int mid = (low+high)/2;
//用这个写法可能会造成浮点数溢出,详见:代码随想录算法训练营第一天 | 704. 二分查找、27. 移除元素_方可申别翘二郎腿的博客-CSDN博客
if(target>nums[mid]){
low=mid+1;
}
if(target<nums[mid]){
high=mid-1;
}
if(target==nums[mid]){
return mid;
}
}
return -1;
}
}
刚开始while条件中写的条件是 low!=high 这样会造成错误:nums数组中只有一个元素时会查找错误。
题目描述:
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
代码:
方法一:暴力求解法
时间复杂度:O(n^2)
1 class Solution { 2 public int removeElement(int[] nums, int val) { 3 int len=nums.length; 4 for(int i=0;i<len;i++){ 5 if(nums[i]==val){ 6 for(int j=i+1;j<len;j++){ 7 nums[j-1]=nums[j]; 8 } 9 i--; 10 len--; 11 } 12 } 13 return len; 14 } 15 }
方法二:双指针(定义快慢指针)
时间复杂度:O(n)
快指针:查找旧数组中等于val的元素。
慢指针:更新新数组中的元素。
代码思路:数组中不等于val的值也是新数组中的元素,所以慢指针所指的元素就等于快指针所指的元素,如果快指针遇到val值,则不更新新数组,快指针继续往下走。
1 class Solution { 2 public int removeElement(int[] nums, int val) { 3 int slow=0; 4 for(int i=0;i<nums.length;i++){ 5 if(nums[i]!=val){ 6 nums[slow]=nums[i]; 7 slow++; 8 } 9 } 10 return slow; 11 } 12 }

浙公网安备 33010602011771号