数据结构基础入门

数据结构

数组、字符串

优点:简单;查询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


考察递归算法的掌握程度

  1. 普通二叉树
  2. 平衡二叉树
  3. 完全二叉树
  4. 二叉搜索树
  5. 四叉树
  6. 多叉树
  7. 特殊的:红黑树、自平衡二叉搜索树
考察点:前序遍历 (树中搜索、创建新的树);中序遍历(二叉搜索树);后序遍历(搜索树信息,从根节点一点点搜索)
(230题)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值