LeetCode704.二分查找
基本思路:首先给定数组为有序且无重复,就可以使用二分查找。具体思路就是先从中间开始找,如果相等,就返回,如果不相等就分为两种情况:
(1)目标值大于了中间值:(因为数组整体有序,假定为升序)因为中间值肯定大于它左边所有的值,而目标值大于了中间值,那么目标值肯定大于了中间值左边所有的值,就完成了当前数组一半的排除,然后将左边界移动到中间值的下一个值(因为这个值已经比较过了),再进行上叙步骤。。。
(2)目标值小于了中间值:那么说明目标值小于了中间值右边所有的值,将右边界移动到中间值的前一个值,然后再进行上叙步骤。。。
上述步骤都放在一个while循环中,当左边界大于右边界的时候循环停止(左边界可以等于右边界)如果while执行完毕都还没有返回,说明没有找到目标值,返回-1,表示没有找到。
Java代码如下:
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
while (left <= right)
{
int mid = left + (right - left) / 2;
if (nums[mid] == target)
{
return mid;
}
if (target > nums[mid])
{
left = mid + 1;
}
else if(target < nums[mid])
{
right = mid - 1;
}
}
return -1;
}
时间复杂度:O(log(n))
空间复杂度:O(1)
LeetCode27.移除元素
基本思路:使用双指针,一个快指针,一个慢指针。快指针负责判断当前值是否和目标值相等。
(1)如果快指针指向的值与目标值相等,快指针继续向下移动,慢指针不动,因为他需要等待快指针指向的值来替换当前的自己所指向的值。两个指针之间形成长度差距,有数组内有多少个需要删除的值就两个指针之间就会有多少的长度差距。
(2)如果快指针指向的值不等于目标值,慢指针指向的值替换为快指针当前指向的值,慢指针向下移动,快指针向下移动,相当于是将需要删除的值用它后面的第一个不相等的值进行覆盖。
每一轮循环如果快指针指向的值不等于要删除的值,都只会发成一次覆盖,当快指针到达数值的最后时,直接返回慢指针的值,因为慢指针和快指针之间的差值就是数值内需要删除的数的个数,题目也说了可以不用管多出来的部分,所以直接舍弃掉就行了。
Java代码如下:
public int removeElement(int[] nums, int val) {
int slowIndex = 0;
int fastIndex = 0;
while(fastIndex <= nums.length - 1)
{
if(val != nums[fastIndex])
{
nums[slowIndex] = nums[fastIndex];
fastIndex++;
slowIndex++;
}else
{
fastIndex++;
}
}
return slowIndex;
}
时间复杂度:O(n)
空间复杂度:O(1)