数据结构
数组、字符串
优点:简单;查询O(1),根据index快速找到
缺点:分配连续的空间,查询是否存在或者增删改需要消耗O(n)时间
242.有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram"
输出: true
示例 2:
输入: s = "rat", t = "car"
输出: false
说明:
你可以假设字符串只包含小写字母。
进阶:
如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
class Solution {
public:
bool isAnagram(string s, string t) {
int *data = new int[26]();
int n = s.length();
int m = t.length();
int temp;
if(n!=m) return false;
for(int i = 0;i<m;i++)
{
temp = s.at(i);
data[temp-'a']++;
}
for(int i = 0;i<n;i++){
temp = t.at(i);
data[temp-'a']--;
if(data[temp-'a']<0) return false;
}
return true;
}
//实际上哈希更简单
class Solution {
public:
bool isAnagram(string s, string t) {
if(s.size() != t.size())
return false;
int hash[26]={0}; //构建哈希数组
for(auto n:s)
hash[n-'a']++;
for(auto n:t)
hash[n-'a']--;
for(int i=0;i<26;i++)
if(hash[i]!=0) return false; //如果两数组不完全相等
return true;
}
};
或者sort排序
class Solution {
public:
bool isAnagram(string s, string t) {
if(s.size()!=t.size())
return false;
sort(s.begin(),s.end());
sort(t.begin(),t.end());
return s==t;
}
};
链表
(用于大量增删改查的东西)
优点:灵活分配空间;O(1);
缺点:查询元素O(n)
快慢指针、翻转链表很常用
栈
后进后出,可以用单链表实现
20.有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
1. 左括号必须用相同类型的右括号闭合。
2. 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
bool isValid(char * s){
if (s == NULL || s[0] == '\0') return true;
char *stack = (char*)malloc(strlen(s)+1); int top =0;
for (int i = 0; s[i]; ++i) {
if (s[i] == '(' || s[i] == '[' || s[i] == '{') stack[top++] = s[i];
else {
if ((--top) < 0) return false;//先减减,让top指向栈顶元素
if (s[i] == ')' && stack[top] != '(') return false;
if (s[i] == ']' && stack[top] != '[') return false;
if (s[i] == '}' && stack[top] != '{') return false;
}
}
return (!top);//防止“【”这种类似情况
}
739.每日温度
根据每日 气温 列表,请重新生成一个列表,对应位置的输出是需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0 来代替。
例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。
提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
int n = temperatures.size();
vector<int> res(n, 0);
stack<int> st;
for (int i = 0; i < temperatures.size(); ++i) {
while (!st.empty() && temperatures[i] > temperatures[st.top()]) {
auto t = st.top(); st.pop();
res[t] = i - t;
}
st.push(i);
}
return res;
}
};
作者:MisterBooo
链接:https://leetcode-cn.com/problems/daily-temperatures/solution/leetcode-tu-jie-739mei-ri-wen-du-by-misterbooo/
队列
先进先出(广度优先搜索)用于一定顺序,数据不断变化时
用双链表实现
双端队列
用双链表实现,实现长度动态变化窗口或者连续区间
239. 滑动窗口最大值
给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回滑动窗口中的最大值。
进阶:
你能在线性时间复杂度内解决此题吗?
示例:
输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3
输出: [3,3,5,5,6,7]
解释:
滑动窗口的位置 最大值
--------------- -----
[1 3 -1] -3 5 3 6 7 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7
提示:
* 1 <= nums.length <= 10^5
* -10^4 <= nums[i] <= 10^4
* 1 <= k <= nums.length
树
考察递归算法的掌握程度
- 普通二叉树
- 平衡二叉树
- 完全二叉树
- 二叉搜索树
- 四叉树
- 多叉树
- 特殊的:红黑树、自平衡二叉搜索树
考察点:前序遍历 (树中搜索、创建新的树);中序遍历(二叉搜索树);后序遍历(搜索树信息,从根节点一点点搜索)
(230题)