代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素。

704. 二分查找

力扣题目链接:https://leetcode.cn/problems/binary-search/

看到题目第一眼还是比较简单的,无非就是不断二分取值比较与target的大小,一步步缩小区间。

本题的复杂点在于right节点是取开区间还是闭区间。

right节点取闭区间:

class Solution {
public:
	int search(vector& nums, int target) {
		int left = 0;
		int right = nums.size() - 1;
		int middle;
		while (true) {
			if (left > right) {
				return -1;
			}
			middle = left + (right - left) / 2;
			if (nums[middle] == target) {
				return middle;
			}
			else if (nums[middle] < target) {
				left = middle + 1;
			}
			else if (nums[middle] > target) {
				right = middle - 1;
			}
		}
	}
};

right节点取开区间:

class Solution {
public:
	int search(vector& nums, int target) {
		int left = 0;
		int right = nums.size();
		int middle;
		while (true) {
			if (left >= right) {
				return -1;
			}
			middle = left + (right - left) / 2;
			if (nums[middle] == target) {
				return middle;
			}
			else if (nums[middle] < target) {
				left = middle + 1;
			}
			else if (nums[middle] > target) {
				right = middle;
			}
		}
	}
};

本题踩坑:

一开始对于取middle的方法是直接middle = (left + right) / 2,但是这样可能left + right会溢出。

后续改成了middle = left / 2 + right / 2,这种做法更是大错特错。

27. 移除元素

力扣题目链接:27. 移除元素 - 力扣(LeetCode)

本题考虑暴力循环法和双指针法。

暴力循环法过于基础,没啥好深究的。

双指针法我的思路一开始是指针从后往前走,后续发现这种做法行不通。

class Solution {
public:
	int removeElement(vector& nums, int val) {
		int fast = 0;
		int slow = 0;
		while (fast < nums.size()) {
			if (nums[fast] == val) {
				fast++;
				continue;
			}
			nums[slow] = nums[fast];
			fast++;
			slow++;
		}
		int removeNums = fast - slow;
		while (removeNums--) {
			nums.pop_back();
		}
		return nums.size();
	}
};

看代码随想录里的代码的时候才发现直接使用resize函数就可以了,根本不需要一步步pop_back

你可能感兴趣的:(算法)