704.二分查找
思路:取数组的长度,分别赋值左指针和右指针。在while循环直到left<=right(或者left<right)时跳出(这里的区别在是用左闭右闭还是左闭右开的方法),取值middle,再判断nums[middle]和目标数是大于小于或者等于,如果大于就right=middle-1(或者right = middle),小于left= middle+1,等于就直接输出。没有就返回-1。
相关文章:二分查找详解_闭区间的二分法查找_0到1点的博客-CSDN博客
C#代码:(左闭右闭和左闭右开)
//左闭右开
public int Search(int[] nums, int target) {
int left = 0;
int right = nums.Length;
while(left < right){
int middle = left + (right - left)/2;
if(nums[middle] > target){
right = middle;
}
else if(nums[middle] < target){
left = middle + 1;
}
else{
return middle;
}
}
return -1;
}
//左闭右闭
public int Search(int[] nums, int target) {
int left = 0;
int right = nums.Length;
while(left <= right){
int middle = left + (right - left)/2;
if(nums[middle] > target){
right = middle-1;
}
else if(nums[middle] < target){
left = middle + 1;
}
else{
return middle;
}
}
return -1;
}
27.移除元素
思路:用到双指针的方法,一个快指针k和慢指针m,可以把双指针看成两个数组。快指针负责遍历数组内所有元素,当快指针找到和目标数val不相同时,慢指针得到快指针指向的元素,随后加加;如果和目标数一样,慢指针跳过不赋值,直到快指针遍历完所有元素,最后输出慢指针。
C#代码:
public class Solution {
public int RemoveElement(int[] nums, int val) {
int m=0;
for(int k=0;k<nums.Length;k++){
if(val != nums[k]){
nums[m] = nums[k];
m++;
}
}
return m;
}
}
34.在排序数组中查找元素的第一个和最后一个位置
34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)
思路:用到双指针的方法,开始之前赋值数组a为{-1,-1},判断数组长度为0和1的情况,判断没问题就从左边循环到右边,如果中间有目标数,跳出,右边同理。判断左右是否相同,不相同则赋值后输出数组a;相同再判断是否和目标数相同,不同直接输出数组a,相同再去赋值后输出数组a。
C#代码:
public class Solution {
public int[] SearchRange(int[] nums, int target) {
//这里判断数组长度为0和1的情况。
int[] a = { -1, -1 };
if (nums.Length == 0) { return a; }
if (nums.Length == 1 && target == nums[0])
{
a[0] = 0; a[1] = 0; return a;
}
else if (nums.Length == 1 && target != nums[0]) { return a; }
int left = 0;
int right = nums.Length - 1;
//循环左边直到目标数跳出。
for (int i = 0; i < right; i++)
{
if (nums[left] == target) { break; }
else left++;
}
//循环右边直到目标数跳出。
for (int i = right; i > left; i--)
{
if (nums[right] == target) { break; }
else right--;
}
//左右数值相同,判断是否符合目标数
if (left == right)
{
if (nums[left] == target)
{
a[0] = left; a[1] = right;
return a;
}
else { return a; }
}
a[0] = left;
a[1] = right;
return a;
}
}
35.搜索插入位置
思路:和二分查找的思路基本一样,但要注意只能用左闭右闭。如果用左闭右开的方法,出现这个例子({1,3,5,6},7),前面循环一样,最后因为left<right,导致left只加到数组nums.Length-1,此时left指向3,也就是在5,6之间插入7。
C#代码:
public class Solution {
public int SearchInsert(int[] nums, int target) {
int left = 0;
int right = nums.Length-1;
while(left <= right){
int middle = left + (right-left)/2;
if(nums[middle] < target){
left = middle+1;
}
else if(nums[middle] > target){
right = middle-1;
}
else{return middle;}
}
return left;
}
}
总结:今天这4道题因为之前有刷过一次,还有点印象,看一下视频就知道怎么做了。算是重新学习二分法和双指针。