代码随想录算法训练营day01|704. 二分查找,27. 移除元素,977.有序数组的平方
1.代码随想录算法训练营day01|704. 二分查找,27. 移除元素,977.有序数组的平方
2.代码随想录算法训练营day02|209.长度最小的子数组,59.螺旋矩阵II3.代码随想录算法训练营day03|203.移除链表元素,707.设计链表,206.反转链表4.代码随想录算法训练营day04|24.两两交换链表中的节点,19.删除链表的倒数第N个节点,面试题 02.07.链表相交,142.环形链表II5.代码随想录算法训练营day06|242.有效的字母异位词,349.两个数组的交集,202.快乐数,1.两数之和6.代码随想录算法训练营day07|454.四数相加II,383.赎金信,15.三数之和,18.四数之和7.代码随想录算法训练营day08|344.反转字符串,541.反转字符串II,卡码网:54.替换数字8.代码随想录算法训练营day09|151.翻转字符串里的单词,卡码网:55.右旋转字符串,28.实现 strStr(),459.重复的子字符串704. 二分查找
题目链接:https://leetcode.cn/problems/binary-search/description/
我的代码:
class Solution { public: int search(vector<int> &nums, int target) { int low = 0, high = nums.size() - 1; // 此处分情况讨论 return searchTarget(nums, low, high, target); } int searchTarget(vector<int> &nums, int low, int high, int target) { while (high >= low) { // 此处分情况讨论 int mid = (low + high) / 2; // 可作差除以二后加较小数防止溢出 if (nums[mid] == target) { return mid; } if (nums[mid] > target) { high = mid - 1; } // 此处分情况讨论 if (nums[mid] < target) { low = mid + 1; } // 此处分情况讨论 } return -1; } };
本题左闭右闭区间,另有左闭右开等情况,分情况讨论。
27. 移除元素
题目链接:https://leetcode.cn/problems/remove-element/description/
我的代码(暴力解法):
class Solution { public: int removeElement(vector<int>& nums, int val) { int k = 0, n = nums.size(); for (int i = 0; i < n; i++) { if (nums[i] == val) { for (int j = i; j < n - 1; j++) { nums[j] = nums[j + 1]; } i--; n--; } else k++; } return k; } };
将不含val的数组元素依次向前移动形成新数组。
双指针解法(快慢指针):
class Solution { public: int removeElement(vector<int>& nums, int val) { int slow = 0; for (int fast = 0; fast < nums.size(); fast++) { if (nums[fast] != val) { nums[slow++] = nums[fast]; } } return slow; } };
快指针:依次向后寻找不含val的新数组元素。
慢指针:记录新数组的下标。
977.有序数组的平方
题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/
我的代码(暴力解法):
class Solution { public: vector<int> sortedSquares(vector<int>& nums) { for (int i = 0; i < nums.size(); i++) { nums[i] = nums[i] * nums[i]; } for (int i = 0; i < nums.size() - 1; i++) { for (int j = 0; j < nums.size() - i - 1; j++) { if (nums[j] > nums[j + 1]) { int temp = nums[j + 1]; nums[j + 1] = nums[j]; nums[j] = temp; } } } return nums; } };
先平方再冒泡排序。
双指针解法(左右指针):
class Solution { public: vector<int> sortedSquares(vector<int>& nums) { vector<int> result(nums.size(), 0); int i = 0; int j = nums.size() - 1; int k = nums.size() - 1; while (i <= j) { if (nums[i] * nums[i] >= nums[j] * nums[j]) { result[k--] = nums[i] * nums[i]; i++; } else { result[k--] = nums[j] * nums[j]; j--; } } return result; } };
左右指针都向中间移动,较大的放入数组末端直到两指针相遇。
合集:
代码随想录算法训练营C++
分类:
代码随想录算法训练营C++
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性