力扣刷题记录

这里写自定义目录标题

  • 一个菜鸡的力扣刷题记录
    • 数组
      • 二分查找
        • 704.二分查找
        • 035.搜索插入位置
      • 034.在排序数组中查找元素的第一个和最后一个位置
      • 移除元素
      • 有序数组的平方
      • 长度最小的子数组
      • 螺旋矩阵Ⅱ
      • 总结
    • 链表
      • 移除链表元素
      • 设计链表
      • 翻转链表
      • 两两交换链表中的节点
      • 删除链表的倒数第N个节点
      • 链表相交
      • 环形链表Ⅱ
      • 总结
    • 哈希表
      • 有效的字母异位词
      • 两个数组的交集
      • 快乐数
      • 两数之和
      • 四数相加Ⅱ
      • 赎金信
      • 三数之和
      • 四数之和
      • 总结
    • 字符串
      • 反转字符串
      • 反转字符串Ⅱ
      • 替换空格
      • 反转字符串里的单词
      • 左旋转字符串
      • 实现strStr()
      • 重复的子字符串
      • 总结

一个菜鸡的力扣刷题记录

自2022/12/25起开始刷题,并记录刷题过程以及在刷题过程中遇到或可能遇到的问题。

刷题顺序参考代码随想录

数组

数组部分将包含:二分查找、移除元素、有序数组的平方、长度最小的子数组与螺旋矩阵Ⅱ。

二分查找

主要是二分查找并涉及一些其他相关的题目。

二分查找应当先符合两点要求:
1、数组有序
2、无重复元素

704.二分查找

2022/12/25
该题应当注意两点
1、不同的区间选择,不同的写法(左闭右闭,左闭右开)。
2、更新中间值为防止溢出,选择特殊的写法。

左闭右闭的情况下,

//左闭右闭
class Solution {
public:
	int search(vector<int>& nums, int target) {
		int right = 0, left = nums.size() - 1;//设置搜索区间
		while (right <= left)
		{
			int mid = left + ((right - left) / 2);//更新中间值		
			//查找
			if (nums[mid] > target)//若该值大于目标值
				left = mid - 1;//更新上限
			else if (nums[mid] < target)//该值小于目标值
				right = mid + 1;//更新下限
			else
				return mid;//数值相同返回下标
		}
		return -1;
	}
};

035.搜索插入位置

2022/12/25
该题相较于704_二分查找来说,仅需改动不存在的时候的返回值即可。

class Solution {
public:
	int searchInsert(vector<int>& nums, int target) {
		int right = 0, left = nums.size() - 1;//设置搜索区间
		while (right <=left)
		{
			int mid = left + ((right - left) / 2);//更新中间值
			//继续查找
			if (nums[mid] > target)//若该值大于目标值
				left = mid - 1;//更新上限
			else if (nums[mid] < target)//该值小于目标值
				right = mid + 1;//更新下限
			else
				return mid;//数值相同返回下标
		}
		return right;//不存在返回应该插入的位置
	}
};

034.在排序数组中查找元素的第一个和最后一个位置

2022/12/25
前者是看题解前自己写的代码,后者是官方题解。

自己写的代码

存在的问题: 时间复杂度很有可能达到O(n)
发现的问题: low >= 0 && nums[low] == target,如上,应当先判断是否越界,再判断是否相等,否则发生越界。

class Solution {
public:
	vector<int> searchRange(vector<int>& nums, int target) {
		vector<int> result;
		int right = 0, left = nums.size() - 1, mid = 0;//设置搜索区间
		while (1)
		{
			mid = left + ((right - left) / 2);//更新中间值

			if (right > left)//检查搜索区间是否合法
			{
				result = { -1,-1 };
				break;
			}//不存在将范围定在-1,-1
			else if (nums[mid] == target)//检查数值
			{
				result = { mid, mid };//为结果赋初值
				int low = mid, high = mid;//设置范围
				while (low >= 0 && nums[low] == target) low--;//判断下界
				result[0] = low + 1;//更新下界
				while (high <= nums.size() - 1 && nums[high] == target) high++;//判断上界
				result[1] = high - 1;//更新上界
				break;
			}

			//继续查找
			if (nums[mid] > target)//若该值大于目标值
				left = mid - 1;//更新上限
			else//该值小于目标值
				right = mid + 1;//更新下限
		}

官方题解

移除元素

有序数组的平方

长度最小的子数组

螺旋矩阵Ⅱ

总结

链表

移除链表元素

设计链表

翻转链表

两两交换链表中的节点

删除链表的倒数第N个节点

链表相交

环形链表Ⅱ

总结

哈希表

有效的字母异位词

两个数组的交集

快乐数

两数之和

四数相加Ⅱ

赎金信

三数之和

四数之和

总结

字符串

反转字符串

反转字符串Ⅱ

替换空格

反转字符串里的单词

左旋转字符串

实现strStr()

重复的子字符串

总结

你可能感兴趣的:(学习记录,leetcode,算法,数据结构,c++,学习)