leetcode 算法小技巧

这篇博客涵盖了多种算法和数据结构的应用,包括使用备忘录优化斐波那契数列计算,求解最小值,暴力法解决问题,遍历unordered_map,字符串处理,数组降序排序,数组之和计算,二维数组的resize,字符串反转,链表反转及操作,以及树的中序遍历。这些内容涉及基础算法和高效编程技巧。
摘要由CSDN通过智能技术生成

1 备忘录

可以用一维数组或者哈希表充当备忘录。

int fib(int N) {    // 备忘录全初始化为 0    int[] memo = new int[N + 1];    // 进行带备忘录的递归    return helper(memo, N);}int helper(int[] memo, int n) {    // base case    if (n == 0 || n == 1) return n;    // 已经计算过,不用再计算了    if (memo[n] != 0) return memo[n];    memo[n] = helper(memo, n - 1) + helper(memo, n - 2);    return memo[n];}

2 求a,b,c三个数的最小值

min(a,min(b, c);

3 求最小值

int minValue = 0; minValue = min(minValue, value); //这样写的话,由于minValue初始化的值本来就为0,最后输出结果可能为0,因此该定义 int minValue = INT_MAX;

4 暴力法

解题搞不定了,用暴力法,结构为;

for (int i = 0; i < len; i++) {

for (int j = 0; j < i; j++)

}

5 跳跃重复的数字:

int temp = num[i];
while (num[i] == temp) {
    i++
}

6 unordered_map 遍历

for (auto [key,value] : map)

7 如何将一个句子strs的每个单词都分开并存到vector<string> str中去?

用word 记录每一个单词,用isalpha() 函数来判断是否为字母;isalnum()判断是否为数字字母;tolower() 转成小写字母,toupper() 转成大写字母;
string word = "";
for (int i = 0; i < strs.size(); i++) {
	if (isalpha(strs[i])) {
		word.push_back(strs[i]);
	} else if (word.size() > 0) {
		str.push_back(word);
		word = "";
	}
}

8 如何将nums 数组降序排序

sort(nums.begin(), nums.end(), greater<int>()); 

9 如何计算一个数组之间的和?

accumulate(num.begin(), num.end(), val);  //其中val 为要计算的初值

10 二维数组resize()

matrix.resize(4, vector<int>(4,1)); //resize 一个4x4  初值为1 的矩阵cd +

11 如何将string 进行反转?

1 reverser(str.begin(), str.end())
2 string reverseStr(str.rbegin(), str.rend());
//begin() 返回str 第一个元素所在迭代器,end() 返回最后一个元素的下一个位置迭代器;
//rbegin() 返回str 返回最后一个元素迭代器,rend() 返回第一个元素的前一个位置迭代器

12 反转链表函数

    ListNode* reserveList(ListNode* head) {
        ListNode* cur = head, *prev = nullptr;
        while (cur != nullptr) {
            ListNode* next = cur->next;
            cur->next = prev;
            prev = cur;
            cur = next;
        }
        return prev;
    }

13 链表操作

1)如果产生新的头节点,加入dummy节点可降低代码复杂度。

2)双指针是解决链表问题一种常用的技巧,前后指针,快慢指针。

3)单链表只能从前往后遍历,如要从后往前遍历,可以考虑将链表进行反转。

4)双链表记得理清每一个节点的指像,循环列表小心死循环。

14 树的迭代中序遍历

顺着左子节点的指针遍历二叉树把遇到的每一个节点都添加到栈中,当一个节点被遍历了之后可以通过栈找到它的父节点。

void inorderTraversal(TreeNode* root) {
    stack<TreeNode>myStack;
    TreeNode *cur = root;
    while(cur != nullptr || !myStack.empty()) {
        while (cur != nullptr) {
            myStack.push(cur);
            cur = cur->left;
        }
        cur = myStack.top();
        cout << cur->val << ",";
        myStack.pop();
        cur = cur->right;
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值