二刷笔记写简单一点。培养一下算法思维
二分查找:看到升序,数组中无重复元素,有重复也可以按找最左和最右的思路考虑一下
Leetcode 二分查找大集合:
链接:704. 二分查找
https://leetcode.cn/problems/binary-search/
区间选择 看i==j合不合理
class Solution {
public int search(int[] nums, int target) {
int i=0;
int j=nums.length-1;
//左闭右闭
while(i<=j){
int m=i+j>>>1; //防止溢出 所以用了>>>
if(target>nums[m]){
i=m+1;
}else if(target<nums[m]){
j=m-1;
}else{
return m;
}
}
return -1;
}
}
链接:35. 搜索插入位置
https://leetcode.cn/problems/search-insert-position/
class Solution {
public int searchInsert(int[] nums, int target) {
int i=0;
int j=nums.length-1;
while(i<=j){
int m=i+j>>>1;
if(target>nums[m]){
i=m+1;
}else if(target<nums[m]){
j=m-1;
}else{
return m;
}
}
return i; //return j+1;也可以
}
}
链接:34. 在排序数组中查找元素的第一个和最后一个位置
https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/description/
虽然有重复,但也可以用二分的思路做,找最左边的和最右边的
class Solution {
public int[] searchRange(int[] nums, int target) {
int x=findleft(nums,target);
int y=findright(nums,target);
if(x==-1||y==-1){
return new int []{-1,-1};
}else{
return new int []{x,y};
}
}
public int findleft(int[] nums,int target){
int i=0,j=nums.length-1;
int index=-1;
while(i<=j){
int m=i+j>>>1;
if(target>nums[m]){
i=m+1;
}else if(target<nums[m]){
j=m-1;
}else{
index=m; // 记录候选位置
j=m-1; // 继续向左
}
}
return index; //找到返回最靠左的索引
}
public int findright(int[] nums,int target){
int i=0,j=nums.length-1;
int index=-1;
while(i<=j){
int m=i+j>>>1;
if(target>nums[m]){
i=m+1;
}else if(target<nums[m]){
j=m-1;
}else{
index=m; // 记录候选位置
i=m+1; // 继续向右
}
}
return index; //找到返回最靠右的索引
}
}
链接 69.x的平方根
https://leetcode.cn/problems/sqrtx/description/
想象成二分
class Solution {
public int mySqrt(int x) {
if(x==0) return 0;
if(x==1) return 1;
long i=1;
long j=x-1;
while(i<=j){
long m=(i+j)/2;
if(m*m>x){
j=m-1;
}else if(m*m<x){
i=m+1;
}else{
return (int)m;
}
}
return (int)i-1;
}
}
链接 367.有效的完全平方数
https://leetcode.cn/problems/valid-perfect-square/
class Solution {
public boolean isPerfectSquare(int num) {
long i=0;
long j=num-1;
if(num==1|| num==0) return true;
while(i<=j){
long m=(i+j)/2;
if(m*m>num){
j=m-1;
}else if(m*m<num){
i=m+1;
}else{
return true;
}
}
return false;
}
}
27 移除元素
https://leetcode.cn/problems/remove-element/
双指针秒了
class Solution {
public int removeElement(int[] nums, int val) {
int slow=0;
for(int fast=0;fast<nums.length;fast++){
if(nums[fast]!=val){
nums[slow]=nums[fast];
slow++;
}
}
return slow;
}
}