• 刷算法题时发现的一些小贴士


    1.不同位数相加时的技巧

    相加算法是我自己定义的名字,具体问题如下:假设每次循环返回一个int,第一次返回1,第二次返回2,第三次返回3,最后算法的结果是123,如何计算?

    这个 问题看似简单其实有一个问题,就是你并不知道循环的次数是多少,也就是说无法确定1乘以的究竟是10的几次方,下面介绍两种方法:

    方法一:

    用stack的思想,把每次循环的值都存在stack中,这样以先进后出的性质,最后只需要每次pop出一个值,先乘以1,再依次乘以10,100,1000即可算出123

    方法二:

    这个方法比较巧妙,就是令val=val*10+x;其中val初始化为0,x为每次循环的值。这样的话就不需要借助额外的存储空间了。

    2.&的妙用

    比如下面这段代码,最后的输出是ans,我需要ans随着递归的每一层的进行都改变它的值,而且改变其真正的值,这时候就要在方法实现的时候在ans前面加上&。但是k是一个临时变量,在计算每一条路径时都会有不同的值,我希望递归的每一层都会改变k的值,但是却不影响上一层的递归,即这层递归结束后k还是原来上一层递归的值,这时候再在方法实现的时候就不需要在k之前加&

     1 int minDepth(TreeNode* root) {
     2         if (!root)
     3             return 0;
     4         int ans = INT_MAX;
     5         int k = 1;
     6         dfs(root,ans,k);
     7         return ans;
     8     }
     9     void dfs(TreeNode* root, int &ans, int k) {
    10         if (root->left == NULL && root->right == NULL) {
    11             ans = min(k,ans);
    12             return;
    13         }
    14         if (root->left || root->right)
    15             k++;
    16         if (root->left) 
    17             dfs(root->left, ans, k);    
    18         if (root->right) 
    19             dfs(root->right, ans, k);
    20     }

     3.字符串倒序

    1 #include<string>
    2 int main()
    3 {
    4     string str="cvicses";
    5     string s(str.rbegin(), str.rend());
    6     cout << s << endl;
    7     return 0;
    8 }

     4.自定义数据结构的排序

    1 #include<algorithm>
    2 sort(pairs.begin(), pairs.end(), [](vector<int>& a, vector<int>& b) {
    3             return a[0] < b[0];
    4         });

     5.全排列

     1 #include <iostream>
     2 using namespace std;
     3 void swap(int &a, int &b) {
     4     int temp = a;
     5     a = b;
     6     b = temp;
     7 }
     8 void perm(int list[], int low, int high) {
     9     if (low == high) {   //当low==high时,此时list就是其中一个排列,输出list
    10         for (int i = 0; i <= low; i++)
    11             cout << list[i]<<" ";
    12         cout << endl;
    13     }
    14     else {
    15         for (int i = low; i <= high; i++) {//每个元素与第一个元素交换
    16             swap(list[i], list[low]);
    17             perm(list, low + 1, high); //交换后,得到子序列,用函数perm得到子序列的全排列
    18             swap(list[i], list[low]);//最后,将元素交换回来,复原,然后交换另一个元素
    19         }
    20     }
    21 }
    22 int main()
    23 {
    24     int list[] = { 1,2,3,4,5,6,7,8,9 };
    25     perm(list, 0, 4);
    26     return 0;
    27 }
  • 相关阅读:
    LeetCode Array Easy 414. Third Maximum Number
    LeetCode Linked List Medium 2. Add Two Numbers
    LeetCode Array Easy 283. Move Zeroes
    LeetCode Array Easy 268. Missing Number
    LeetCode Array Easy 219. Contains Duplicate II
    LeetCode Array Easy 217. Contains Duplicate
    LeetCode Array Easy 189. Rotate Array
    LeetCode Array Easy169. Majority Element
    LeetCode Array Medium 11. Container With Most Water
    LeetCode Array Easy 167. Two Sum II
  • 原文地址:https://www.cnblogs.com/yuanninesuns/p/9147521.html
Copyright © 2020-2023  润新知