代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素 977.有序数组的平方
704. 二分查找、27. 移除元素 977.有序数组的平方
704.二分查找
左闭右闭
int l=0,r=nums.length-1; while(l<=r) l=m+1; r=m-1;
class Solution {
public int search(int[] nums, int target) {//左闭右闭
int l=0,r=nums.length-1;
while(l<=r){
int m=(l+r)>>>1;
if(nums[m]<target){//是nums[m]与target比较 不是m与target
l=m+1;
}else if(nums[m]>target){
r=m-1;
}else{
return m;
}
}
return -1;
}
}
左闭右开
int l=0,r=nums.length; while(l<r) l=m+1; r=m;
class Solution {
public int search(int[] nums, int target) {//左闭右开
int l=0,r=nums.length;
while(l<r){
int m=(l+r)>>>1;
if(nums[m]<target){//是nums[m]与target比较 不是m与target
l=m+1;
}else if(nums[m]>target){
r=m;
}else{
return m;
}
}
return -1;
}
}
if(nums[m]<target){//是nums[m]与target比较 不是m与target
27.移除元素
双指针法
class Solution {
public int removeElement(int[] nums, int val) {
int n=nums.length;
for(int i=0;i<n;i++){
if(nums[i]==val){
for(int j=i+1;j<n;j++){
nums[j-1]=nums[j];//不是nums[i]=nums[j];这里面i是不变的 想持续更新 需要两个变量
}
i--;//指的依旧是现在这个数 只不过原来的数被删了重新验证一下新的数
n--;//数组长度-1 确定循环次数 同时也是新数组长度
}
}
return n;//return 的不是i是n i在循环结束已经被删掉了 n代表新数组长度
}
}
nums[j-1]=nums[j];//不是nums[i]=nums[j];这里面i是不变的 想持续更新 需要两个变量
数组长度更新以及反复检验用 i--和n-- 很巧妙 我没想到
return n;//return 的不是i是n i在循环结束已经被删掉了 n代表新数组长度
977.有序数组的平方
暴力排序
class Solution {
public int[] sortedSquares(int[] nums) {
for (int i = 0; i < nums.length; i++) {
nums[i] = nums[i] * nums[i];
}
Arrays.sort(nums);
return nums;
}
}
如动画所示:
双指针
class Solution {
public int[] sortedSquares(int[] nums) {
int n=nums.length;
int l=0,r=n-1;
int[] ans=new int[n];
int j=n-1;
while(l<=r){//写成l<=n了 粗心大意这一块
if(nums[l]*nums[l]>nums[r]*nums[r]){// if(nums[l] * nums[l] > nums[r] * nums[r])
ans[j]=nums[l]*nums[l];// res[j--] = nums[l] * nums[l++];
j--;
l++;
}else{
ans[j]=nums[r]*nums[r];
j--;
r--;
}
}
return ans;
}
}