目录
一、LeetCode 704. 二分查找
题目链接:. - 力扣(LeetCode)
题目描述:给定一个 n
个元素有序的(升序)整型数组 nums
和一个目标值 target
,写一个函数搜索 nums
中的 target
,如果目标值存在返回下标,否则返回 -1
。
题目思路:
这道题目的前提是数组为有序数组,同时题目还强调数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的,这些都是使用二分法的前提条件,当大家看到题目描述满足如上条件的时候,可要想一想是不是可以用二分法了。
二分查找涉及的很多的边界条件,逻辑比较简单,但就是写不好。例如到底是
while(left < right)
还是while(left <= right)
,到底是right = middle
呢,还是要right = middle - 1
呢?
方法一:左闭右闭
int search(int* nums, int numsSize, int target) {
int left=0;
int right=numsSize-1;
while(left<=right)
{
int midel=(left+right)/2;
if(nums[midel]>target)
{
right=midel-1;
}
else if(nums[midel]<target)
{
left=midel+1;
}
else if(nums[midel]==target)
{
return midel;
}
}
return -1;
}
方法二:左闭右开
int search(int* nums, int numsSize, int target) {
int left=0;
int right=numsSize;
while(left<right)
{
int midle=(left+right)/2;
if(nums[midle]>target)
{
right=midle;
}
else if(nums[midle]<target)
{
left=midle+1;
}
else if(nums[midle]==target)
{
return midle;
}
}
return -1;
}
二、LeetCode 27. 移除元素
假设 nums
中不等于 val
的元素数量为 k
,要通过此题,您需要执行以下操作:
- 更改
nums
数组,使nums
的前k
个元素包含不等于val
的元素。nums
的其余元素和nums
的大小并不重要。 - 返回 k;
题目思路:
双指针做法:通过一个快指针与慢指针在循环中完成;
快指针:寻找新数组的元素,新数组就是不含目标元素的数组;
慢指针:指向更新,在满指针的左边,是已经满足要求的数组;
int removeElement(int* nums, int numsSize, int val) {
int slow=0;
for(int fast=0;fast<numsSize;fast++)
{
if(nums[fast]!=val)
{
nums[slow]=nums[fast];
slow++;
}
}
return slow;
}
三、LeetCode977.有序数组的平方
题目链接:. - 力扣(LeetCode)
题目描述:给你一个按 非递减顺序 排序的整数数组 nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
题目思路:
数组其实是有序的, 只不过负数平方之后可能成为最大数了。
那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。
此时可以考虑双指针法了,i指向起始位置,j指向终止位置。
定义一个新数组result,和A数组一样的大小,让k指向result数组终止位置。
如果
A[i] * A[i] < A[j] * A[j]
那么result[k--] = A[j] * A[j];
。如果
A[i] * A[i] >= A[j] * A[j]
那么result[k--] = A[i] * A[i];
。
int* sortedSquares(int* nums, int numsSize, int* returnSize) {
*returnSize = numsSize;
int left=0;
int right=numsSize-1;
int *ret=(int*)malloc(numsSize*sizeof(int));
int index=numsSize-1;
while(index>=0)
{
int ll=nums[left]*nums[left];
int rr=nums[right]*nums[right];
if(ll>rr)
{
ret[index]=ll;
left++;
}
else
{
ret[index]=rr;
right--;
}
index--;
}
return ret;
}