数据结构与算法
leetcode && 剑指offer
workingwei
Linux C/C++服务端,Linux驱动,嵌入式
展开
-
判断一个点是否在三角形内部
#include <iostream>#include <math.h>using namespace std;struct Point { double x; double y;};double getDist(Point p1,Point p2) { //两点之间计算距离公式 return sqrt(pow(p1.x-p2.x,2) + pow(p1.y-p2.y,2));}double getArea(Point p1,Poin原创 2022-04-07 00:03:11 · 495 阅读 · 0 评论 -
8. 字符串转换整数 (atoi)
class Solution {public: int myAtoi(string s) { long res = 0; int flag = 1;//正负号 int index = 0; while(index < s.size() && s[index] == ' ')//去除空格 { ++index; } if(s[in原创 2022-04-01 23:51:43 · 179 阅读 · 0 评论 -
双向链表的插入与删除
struct doubleList{ int val; doubleList * left; doubleList * right; doubleList(int num) : val(num), left(nullptr), right(nullptr) {}};//1.实现双向链表, 在节点P后插入一种节点bool insertNode(doubleList * p, int num){ doubleList * node = new doubleList(num); dou原创 2022-03-31 17:40:32 · 339 阅读 · 0 评论 -
867. 转置矩阵
思路利用转置矩阵的性质即可class Solution {public: vector<vector<int>> transpose(vector<vector<int>>& matrix) { vector<vector<int>> res(matrix[0].size(), vector<int>(matrix.size(), 0));//注意新声明的矩阵行和列要交换大.原创 2022-03-07 21:43:21 · 139 阅读 · 0 评论 -
1047. 删除字符串中的所有相邻重复项
class Solution {public: string removeDuplicates(string s) { stack<char> stk; string res; stk.push(s[0]);//先将第一个元素压入栈中 for(int i = 1; i < s.size(); ++i)//从 i == 1 开始遍历字符串 { if(!stk.emp原创 2022-03-01 20:54:22 · 70 阅读 · 0 评论 -
20. 有效的括号
思路遍历整个字符串,如果遍历到左边元素,则将该元素对应的右边元如push到栈中如果遍历到“非左边元素”,则比较该元素是否与栈顶元素相同,如果相同则pop掉该元素,否则返回 falseclass Solution {public: bool isValid(string s) { stack<int> st; for (int i = 0; i < s.size(); ++i) { if (s[i] == '(')//遍历整个字符串,如果.原创 2022-03-01 20:42:27 · 92 阅读 · 0 评论 -
225. 用队列实现栈
思路一个队列在模拟栈弹出元素的时候只要将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部,此时在去弹出元素就是栈的顺序了。class MyStack {public: queue<int> que; /** Initialize your data structure here. */ MyStack() { } /** Push element x onto stack. */ void push(int x) /.原创 2022-03-01 20:23:36 · 71 阅读 · 0 评论 -
232. 用栈实现队列
思路用两个栈实现一个队列一个栈是输入栈,一个栈是输出栈,所有输入的数据都放在输入栈,只要输出栈有数据就酱数据从输出栈中pop,否则将所有输入栈的数据转移至输出栈后,再冲输出栈pop数据。class MyQueue {public: /** Initialize your data structure here. */ MyQueue() { } /** Push element x to the back of queue. */ void push(int x) {.原创 2022-03-01 20:02:01 · 62 阅读 · 0 评论 -
19. 删除链表的倒数第 N 个结点
思路如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), .原创 2022-02-28 21:29:41 · 194 阅读 · 0 评论 -
344. 反转字符串
class Solution {public: void reverseString(vector<char>& s) { for (int i = 0, j = s.size() - 1; i < s.size() / 2; ++i, --j) { swap(s[i], s[j]); } return; }};原创 2022-02-28 21:22:43 · 65 阅读 · 0 评论 -
27. 移除元素
class Solution {public: int removeElement(vector<int>& nums, int val) { int i = 0; for (int j = 0; j < nums.size(); ++j) { if (nums[j] != val) { nums[i++] = nums[j]; } } return i; }};原创 2022-02-28 21:21:47 · 63 阅读 · 0 评论 -
剑指 Offer 58 - II. 左旋转字符串
class Solution {public: string reverseLeftWords(string s, int n) { reverse(s.begin(), s.begin() + n); reverse(s.begin() + n, s.end()); reverse(s.begin(), s.end()); return s; }};原创 2022-02-24 21:11:52 · 57 阅读 · 0 评论 -
151. 翻转字符串里的单词
class Solution {public: void removeSpace(string& s) { int first = 0; int ssize = s.size() -1; while(s[ssize] == ' ') { --ssize;//去除尾部空格 } while(s[first] == ' ')原创 2022-02-24 20:59:59 · 63 阅读 · 0 评论 -
剑指 Offer 05. 替换空格
class Solution {public: string replaceSpace(string s) { int count = 0; for (int i = 0; i < s.size(); ++i)//统计空格的数量 { if (s[i] == ' ') ++count; } int sOldNum = s.size(); s.resize(sOldNum + 2 * count);//改变字符串的大小 int sNewNu原创 2022-02-24 20:23:50 · 81 阅读 · 0 评论 -
541. 反转字符串 II
class Solution {public: string reverseStr(string s, int k) { if(s.size() < k) { reverse(s.begin(), s.end()); return s; } for(int i = 0; i < s.size(); ) { reverse(原创 2022-02-24 20:08:01 · 76 阅读 · 0 评论 -
344. 反转字符串
class Solution {public: void reverseString(vector<char>& s) { for (int i = 0, j = s.size() - 1; i < s.size() / 2; ++i, --j) { swap(s[i], s[j]); } return; }};原创 2022-02-24 20:00:48 · 47 阅读 · 0 评论 -
383. 赎金信
class Solution {public: bool canConstruct(string ransomNote, string magazine) { int hash[26] = { 0 }; for (auto c : magazine) { hash[c - 'a'] += 1; } for (auto c : ransomNote) { if ((hash[c - 'a'] -= 1) < 0) {原创 2022-02-23 22:44:01 · 143 阅读 · 0 评论 -
454. 四数相加 II
class Solution {public: int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D) { unordered_map<int, int> hashMap; for (auto a : A) { for (auto b : B) { ++ha原创 2022-02-23 22:40:36 · 52 阅读 · 0 评论 -
18. 四数之和
class Solution {public: vector<vector<int>> fourSum(vector<int>& nums, int target) { vector<vector<int>> result; sort(nums.begin(), nums.end()); for (int k = 0; k < nums.size(); ++k)原创 2022-02-23 22:38:00 · 110 阅读 · 0 评论 -
15. 三数之和
class Solution {public: vector<vector<int>> threeSum(vector<int>& nums) { vector<vector<int>> res; sort(nums.begin(), nums.end()); // 找出a + b + c = 0 // a = nums[i], b = nums[left原创 2022-02-23 22:25:47 · 69 阅读 · 0 评论 -
1. 两数之和
mapclass Solution {public: vector<int> twoSum(vector<int>& nums, int target) { unordered_map<int, int> hashMap;//<数值, 下标> for (int i = 0; i < nums.size(); ++i) { auto it = hashMap.find(target - nums[i].原创 2022-02-23 21:57:04 · 129 阅读 · 0 评论 -
202. 快乐数
思路class Solution{public: // 取数值各个位上的单数之和 int getSum(int n) { int sum = 0; while (n) { sum += (n % 10) * (n % 10); n /= 10; } return sum; } bool isHappy(int n) { unordered_set<int> tempSet; int res=0; while (true).原创 2022-02-23 21:47:32 · 136 阅读 · 0 评论 -
349. 两个数组的交集
set去重class Solution {public: vector<int> intersection(vector<int>& nums1, vector<int>& nums2) { unordered_set<int> res; // 存放结果,为了确保输出元素的唯一性,选用set unordered_set<int> temp(nums1.begin(), nums1.end());/.原创 2022-02-23 21:42:27 · 118 阅读 · 0 评论 -
242. 有效的字母异位词
哈希class Solution {public: bool isAnagram(string s, string t) { if (s.size() != t.size()) { return false; } int hash[26] = { 0 };//构建哈希映射 for (auto c : s) { hash[c - 'a'] += 1; } for (auto c : t) { if ((hash[.原创 2022-02-23 21:33:04 · 127 阅读 · 0 评论 -
25.K 个一组翻转链表
链表模拟题/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), ne.原创 2022-02-23 21:23:19 · 199 阅读 · 0 评论 -
92. 反转链表 II
思路局部反转链表:头插法定义两个指针,分别称之为 g(guard 守卫) 和 p(point)。首先根据方法的参数 m 确定 g 和 p 的位置。将 g 移动到第一个要反转的节点的前面,将 p 移动到第一个要反转的节点的位置上。以 m=2,n=4为例。将 p 后面的元素删除,然后添加到 g 的后面。也即头插法。3、根据 m 和 n 重复步骤(2)4、返回 dummyHead.next/** * Definition for singly-linked list. * struct .原创 2022-02-14 22:48:25 · 378 阅读 · 0 评论 -
287. 寻找重复数
思路和环形链表|| 一样,也是链表的模拟题class Solution {public: int findDuplicate(vector<int>& nums) { int slow = 0; int fast = 0; slow = nums[slow]; fast = nums[nums[fast]]; while (slow != fast)//判断是否有环 { slow = nums[slow]; fast =.原创 2022-02-14 22:04:32 · 235 阅读 · 0 评论 -
142. 环形链表 II
思路首先判断链表是否有环如果链表有环,则分别从头结点 和 两指针相交节点移动,如果相交,则该节点即为环的入口节点/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: List.原创 2022-02-14 21:56:25 · 109 阅读 · 0 评论 -
141. 环形链表
思路判断链表是否有环构建快慢指针慢指针每次移动一个节点,快指针每次移动两个节点,当两指针相等时,说明该链表有环/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: bool.原创 2022-02-14 21:47:18 · 173 阅读 · 0 评论 -
面试题 02.07. 链表相交
思路分别求两个链表的最大长度将较长的链表移动 两链表相差的数目个 节点同时移动两个链表,当找到相同节点时,即找到了链表相交的节点/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public:.原创 2022-02-14 21:29:24 · 225 阅读 · 0 评论 -
19. 删除链表的倒数第 N 个结点
思路链表模拟题:找到倒数第n个节点,删除即可/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *.原创 2022-02-14 21:11:10 · 153 阅读 · 0 评论 -
24. 两两交换链表中的节点
思路本体为链表模拟题,模拟出两个链表节点的反转后即可实现链表的两两反转。构建虚拟头结点将第二个节点变为第一个节点将第一个节点变为第二个节点将第二个节点指向第三个节点/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(i.原创 2022-02-14 20:57:49 · 44 阅读 · 0 评论 -
234. 回文链表
思路找到链表的中间节点将以中间节点作为链表的首节点进行反转比较两个链表是否相等(如果是奇数,cur2比cur1多一个节点,此时注意玄幻条件以cur1为准即可)/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x).原创 2022-02-14 20:46:58 · 51 阅读 · 0 评论 -
206. 反转链表
思路/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* reverseList(ListNode* head) { ListNode* pre =.原创 2022-02-14 20:29:35 · 128 阅读 · 0 评论 -
707. 设计链表
思路考察链表的特性,添加接地点,删除节点,读节点等,重点利用虚拟节点来完成操作。class MyLinkedList { public: // 定义链表节点结构体 struct LinkedNode { int val; LinkedNode* next; LinkedNode(int val) : val(val), next(nullptr){} }; // 初始化链表 MyLinkedList() { dummyHead = new .原创 2022-02-14 20:27:51 · 152 阅读 · 0 评论 -
203. 移除链表元素
思路注意当移除的节点是头结点时,需要使用虚拟节点/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* removeElements(ListNode* head.原创 2022-02-13 18:03:24 · 121 阅读 · 0 评论 -
1288. 删除被覆盖区间
转换为区间覆盖问题即可class Solution {public: bool static cmp(vector<int>& a, vector<int>& b)//按照数组首元素大小进行排序 { return a[0] < b[0]; } int removeCoveredIntervals(vector<vector<int>>& intervals) { if .原创 2022-02-13 12:19:46 · 159 阅读 · 0 评论 -
56. 合并区间
区间问题边合并区间,边加入区间class Solution {public: bool static cmp(vector<int>& a, vector<int>& b)//按照数组首元素大小进行排序 { return a[0] < b[0]; } vector<vector<int>> merge(vector<vector<int>>& intervals) { vec.原创 2022-02-13 11:34:11 · 42 阅读 · 0 评论 -
57. 插入区间
- 区间问题本题中的区间已经按照起始端点升序排列,因此直接遍历区间列表,寻找新区间的插入位置即可。找到插入区间需要插入或者合并的 位置合并区间直接合并直接插入处理合并后的区间class Solution {public: vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval)原创 2022-02-13 11:28:31 · 132 阅读 · 0 评论 -
59. 螺旋矩阵 II
重点在于设置边界条件,其余的与题 54.螺旋矩阵 类似class Solution {public: vector<vector<int>> generateMatrix(int n) { vector<vector<int>> matrix(n, vector<int>(n, 0)); int left = 0; int right = n - 1; int up .原创 2022-02-12 12:14:30 · 262 阅读 · 0 评论