一、二分查找
1.题目:给定一个 n
个元素有序的(升序)整型数组 nums
和一个目标值 target
,写一个函数搜索 nums
中的 target
,如果目标值存在返回下标,否则返回 -1
。
2.思路:二分法
3.注意:左闭右开与左开右闭两者写法的判断条件的区别
4.代码:
class Solution {
public:
int search(vector<int>& nums, int target) {
int size = nums.size();
int leftVal,rightVal,middleVal;
if( nums[0] > target || nums[size-1] < target )
{
return -1;
}
if( target == nums[size-1] )
{
return (size - 1);
}
leftVal = 0;
rightVal = size;
while( leftVal < rightVal )
{
middleVal = int ( (leftVal + rightVal) / 2 );
if( target < nums[middleVal] )
{
// left <= tar < mid
rightVal = middleVal ;
}else if( nums[middleVal] < target )
{
// mid <= tar < right
leftVal = middleVal + 1;
}else{
return middleVal;
}
}
return -1;
}
};
二、移除元素
1.题目:给你一个数组 nums
和一个值 val
,你需要 原地 移除所有数值等于 val
的元素。元素的顺序可能发生改变。然后返回 nums
中与 val
不同的元素的数量。
假设 nums
中不等于 val
的元素数量为 k
,要通过此题,您需要执行以下操作:
- 更改
nums
数组,使nums
的前k
个元素包含不等于val
的元素。nums
的其余元素和nums
的大小并不重要。 - 返回
k
。
2.思路:双指针
3.注意:①慢指针变动的条件 ②快指针强调当前检查元素,慢指针强调元素位置。
4.代码:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int size = nums.size();
int left = 0;
int right = 0;
for( right=0; right < size; right++)
{
if( nums[right] != val)
{
nums[left] = nums[right];
left++;
}
}
return left;
}
};
三、有序数组的平方
1.题目:给你一个按 非递减顺序 排序的整数数组 nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
2.思路:双指针(由数组排序性质可知:大的数字在两侧,小的数字在中间)
3.注意:可新建一个等大小的数组,不必拘泥于在原数组上操作
4.代码:
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int left = 0;
int right = nums.size()-1;
int k = nums.size()-1;
vector<int> result(nums.size(), 0);
while( left <= right )
{
if( nums[left]*nums[left] > nums[right]*nums[right] )
{
result[k] = nums[left]*nums[left];
k--;
left++;
}
else
{
result[k] = nums[right]*nums[right];
k--;
right--;
}
}
return result;
}
};