Leetcode刷题总结和心得(2)

这篇博客分享了C++编程中的二维数组初始化、逗号运算符的使用、字符串操作、回文串概念、回溯算法的应用、子串提取、注释快捷方式、错误检查、数组初始化、map操作、LeetCode解题策略等知识点,并通过示例代码展示了常见的编程错误和修复方法。同时,提到了二叉搜索树和背包问题的基本概念。
摘要由CSDN通过智能技术生成

上一篇太长了,所以分开写一下。

65、二维数组的初始化

方法一:最直接和简单

vector<vector<int>>  v(n,vector<int>(m));//初始化为n x m的矩阵
(要写在类的函数内)

方法二:先定义,后初始化大小,适用于不方便一开始就找到n,m的情况

vector<vector<int>>  v;(可以写在函数外面) 
v =  vector<vector<int>>    (n,vector<int>(m))

66、逗号在两个语句之间

for (int i = 0; i < n; ++i)  dfs(M, P, i, 0), dfs(M, A, i, m - 1);
//两个dfs都在for循环内,如果用分号的话就只有一条语句在for循环内

67、字符串相关的一些语法

将字符串转化成数字
string digits = "23456'
int a = digits[0] - '0'; //a为数字2
string s;
s.push_back(a); //尾部插入a
s.pop_back();  //删除尾部数字,c++11的新特性
字符串数组
string letterMap[10] = {"", "", "abc", "def", 
		"ghi","jkl", "mno", "pqrs", "tuv", "wxyz"};

好久没有学习了,今天是2022年4月6日,要开始学习了。

68、 回文串

“回文串”是一个正读和反读都一样的字符串

69、关联

回溯算法 = 树的深度优先搜索(递归算法) + 剪枝函数

=70、求子串

 string str = "abcdefg";
    string subStr = str.substr(1, 3);//1为开始位置,3为长度
    cout << "subStr = " << subStr << endl; //输出bcd

71、撤回

快捷键 ctra+z

72、语法

for(int i = begin, int j = end; i < j; ++i, --j)	//错误
for(int i = begin,  j = end; i < j; ++i, --j)		//应该这样写


=73、快速注释

1, 先选中要注释的代码段
2,按住ctrl+k+c注释本段代码
3,按住ctrl+k+u取消注释本段代码

74、问题

1、语法,好多语法的细节不会,要多练习.熟能生巧,太久不写代码不行了
2、思路,题目的思路很重要

75、语法

 ans.clear();//清空ans容器中的内容

76、插入语法

 string s = "abc";
    //s.insert(1, "6");//√,输出  a6bc
    //s.insert(1, '6');//×,必须要双引号
    //s.insert(1, 7, '6');//√a6666666bc
    //s.insert(s.begin(), 'p');//对,输出   pabc
    s.erase(s.begin() + 1);//对,输出   ac
    cout << s << endl;

77、去重代码

for(int i = startIndex; i < nums.size(); ++i)
        {
            if(i > 0 && nums[i] == nums[i-1] && used[i-1] == false)    continue;
            
			//步骤1;关键*****************************
            //used[i-1] == false说明同一层不能取一样的
            //used[i-1] == true说明同一树枝不能取一样的
            path.push_back(nums[i]);
            used[i] = true;//步骤2
            backTracking(nums, i + 1, used);
            used[i] = false;//步骤3
            path.pop_back();
        }

回溯法去重基本都是这个套路,这种需要有序数组。
另外,如果没法重排的时候,就要用unordered_set来进行去重。
//used[i-1] == false说明同一层不能取一样的
//used[i-1] == true说明同一树枝不能取一样的

78、leetcode第51题目

一、queen皇后是国际象棋中棋力最高的棋子,每步不限制格数,也不限制方向,横向、纵向、斜向都可以。但皇后不可以越过棋子走棋。
请添加图片描述

二、单词

col、column
row

三、二维棋盘初始化

int n = 8;
std::vector<std::string> chess(n, std::string(n, '.'));
//初始化一个8*8的棋盘
 int n = 8;
 vector<int> chess(n, 6);
 cout << chess[5] << endl;
 //将chess初始化为8个6

四、啊啊啊,找了一个小时的错误

chessBoard[row, col]//这样写错误的
chessBoard[row][col]//引用二维数组应该是这样的

79、数组初始化大小

//vector<int> ans; 这样不行,要给出数组有多少个元素
vector<int> ans(nums.size(), 0);

80、map的使用

 unordered_map<char, int> symbolTable{
        {'I', 1},
        {'V', 5},
        {'X', 10},
        {'L', 50},
        {'C', 100},
        {'D', 500},
        {'M', 1000},
    };

81、leetcode13题目

要找规律,把特殊的融入进一般的流程内部
自己的写法

class Solution {
private:
    int sum = 0;
public:
    int romanToInt(string s) {
       

            for(int i = 0; i < s.size(); ++i)
            {
                
                switch(s[i])
                {
                    case 'I':  
                         if(s[i + 1] == 'V' || s[i + 1] == 'X')    sum = sum - 1;
                         else  sum = sum + 1;
                         break;
                    case 'V':  
                         sum = sum + 5;
                         break;
                    case 'X':  
                         if(s[i + 1] == 'L' || s[i + 1] == 'C')    sum = sum - 10;
                         else  sum = sum + 10;
                         break;
                     case 'L':  
                         sum = sum + 50;
                         break;
                    case 'C':  
                         if(s[i + 1] == 'D' || s[i + 1] == 'M')    sum = sum - 100;
                         else  sum = sum + 100;
                         break;
                    case 'D':  
                         sum = sum + 500;
                         break;
                    case 'M':  
                         sum = sum + 1000;
                         break;

                }
            }
        return sum;
    }
};

官方简短些的写法

class Solution {
private:
    int ans = 0;
    unordered_map<char, int> symbolTable{
        {'I', 1},
        {'V', 5},
        {'X', 10},
        {'L', 50},
        {'C', 100},
        {'D', 500},
        {'M', 1000},
    };

public:
    int romanToInt(string s) {
        for(int i = 0; i < s.size(); ++i){
            if(symbolTable[s[i]] >= symbolTable[s[i + 1]]){
                ans += symbolTable[s[i]];
            }
            else{
                ans -= symbolTable[s[i]];
            }
        }
         return ans;
    }
};
replace(v.begin(), v.end(), 20,2000);替换,将容器v中上的20替换成2000

82、初始化

一、一维数组

vector<int> c(5);
//数组c包含5个元素

日了,千万别写成,一道题目中出现的错误。

vector<int> c[5]

二、二维数组

vector<vector<int>> dp(m, vector<int>(n, 0));

初始化为m*n个0。

83、bug

for(int j = 1; j < n; ++j)

错误写成了下面这样

for(int j = 1; i < n; ++j)

84、等号运算

            for(int j = 1; j < i - 1; ++j){
                dp[5] = max({dp[5], (i - j) * j, dp[i - j] * j});//三个数,要带大括号
//上面这行,因为等号先算右边,所以可以一直更新dp[5]的最大值
            }        

85、二叉搜索树

如果左子树不为空,则左子树上所有节点的数值都小于根节点的数值;
如果右子树不为空,则右子树上所有节点的数值都大于根节点的数值;

86、求绝对值

abs(a);

87、背包问题

比较难
一、前后遍历顺序
从前到后 元素可以重复使用;–完全背包问题
从后到前 元素不可以重复使用;–0-1背包问题

二、里外遍历顺序
外层元素,里层背包 是组合
外层背包,里层元素 是排列

88、vector默认值为0

 vector<int> data(N); 
//默认初始值为N个0”

自己其实挺有天赋的

89、手写错误

vector<vector<int>> dp(n + 1, vector<int>(4, 0));

写成了

vector<vector<int>> dp(n + 1vector<int>(4, 0));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值