刷题20240110

704.二分查找

// 704 二分查找
// 1.左闭右闭区间(使用比较熟练了,就不放注释了)
class Solution {
public:
	int search(vector<int>& nums, int target) {
		int left = 0;
		int right = nums.size() - 1;
		while (left <= right) {
			int mid = (left + right) / 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;
	}
};

// 2.左闭右开区间
class Solution {
public:
	int search(vector<int>& nums, int target) {
		int left = 0;
		int right = nums.size(); //开区间,取数组最后一个元素的后一位置
		while (left < right) {
			int mid = (left + right) / 2;
			if (nums[mid] == target) return mid;
			else if (nums[mid] < target) left = mid + 1; // 左闭
			else if (nums[mid] > target) right = mid; // 右开
		}
	    return -1;
	}
};

// tips 代码随想录采用了位运算来代替除法运算,其实现方式是使用了位运算,比直接除2的方式更高效。

int middle = left + ((right - left) >> 1);
int middle = left + (right - left) / 2;

/* 
    上述代码在计算 (right - left) / 2 的时候,如果 right 和 left 都是非常大的数,
    有可能会导致溢出的问题。为了解决这个问题,我们可以将其改为使用位运算的方式进行计算
*/

27.移除元素

// 27.移除元素
// 本题要求了空间复杂度为O(1),不允许引入额外空间
// 之前刷过本题,但今天再刷一边感觉感觉又有了新的收获
class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int slow = 0;
		for (int fast = 0; fast < nums.size(); fast++) {
			// 无论内部循环如何,fast每次都要递增
			if (nums[fast] != val) {
				nums[slow] = nums[fast]; // 只要fast的元素不等于val,就用它去替换slow的元素
				slow++;
			}
		}
	    return slow;	// 最后这里的返回值一定要思考是slow还是slow + 1	
    }
};

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值