704. 二分查找
题目链接
代码:
class Solution {
public int search(int[] nums, int target) {
// 避免当 target 小于nums[0] nums[nums.length - 1]时多次循环运算 没有想到
if (target < nums[0] || target > nums[nums.length - 1]) {
return -1;
}
// 区间左闭右闭
int middle = (0 + nums.length-1)/2;
int left = 0 ;// 左节点
int right = nums.length-1; // 右节点
while(left < right){
if(nums[middle] < target)
{
left = middle+1;
// 已经比过了就不比了
}
else if(nums[middle] > target)
{
right = middle-1;
}
else{
// 找到了就退出
break;
}
middle = (right + left)/2;
}
if(nums[middle]!=target)return -1;
else return middle;
}
}
用的是左右区间都是闭的二分,能力有限,没有想到要先判断target在不在区间内,本来想写区间左开右闭的二分的,结果一时半伙没有想到如何处理目标不存在的判断。然后就四不像了。
这里附上大佬们的写法
class Solution {
public int search(int[] nums, int target) {
// 避免当 target 小于nums[0] nums[nums.length - 1]时多次循环运算
if (target < nums[0] || target > nums[nums.length - 1]) {
return -1;
}
int left = 0, right = nums.length - 1;
while (left <= right) {
int mid = left + ((right - left) >> 1); //用算术右移来代替/2
if (nums[mid] == target)
return mid;
else if (nums[mid] < target)
left = mid + 1;
else if (nums[mid] > target)
right = mid - 1;
}
return -1;
}
}
27. 移除元素
题目链接
难受,本来不想用暴力来做的,想了个自认为很妙的方法,结果根本就实现不了,最后借助冒泡的思想暴力跑了跑。
class Solution {
public int removeElement(int[] nums, int val) {
int index=0,tag=0;
for(int i=0;i<nums.length;i++){
if(nums[i]==val)tag++;
}
for(int i=0;i<tag;i++)
{
for(int j=0;j<nums.length-i-1;j++)
{
if(nums[j]==val)
{
nums[j]=nums[j+1];
nums[j+1]=val;
}
}
}
return nums.length-tag;
}
}
后面看了大佬的文件,才知道我一开始想的是双指针方法来做这道题,这里附上代码:
// 时间复杂度:O(n)
// 空间复杂度:O(1)
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slowIndex = 0;
for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++) {
if (val != nums[fastIndex]) {
nums[slowIndex++] = nums[fastIndex];
}
}
return slowIndex;
}
};