力扣刷题记录2

力扣刷题记录2

283-移动零,和一些思考

第一题是每日一题的简单题。需要记的并不多,一是用迭代器对vector的一些基本操作。可以参考这里
for(vector::iterator iter=num.begin();iter!=num.end();iter++){
if(*iter==k){
num.erase(iter);
break;
}
}
另外是快排的思想。这种思想实用性很广,即使不需要排序,在找出最大的k个数,对数组进行分割(以中间点为基准)等可以大大降低时间复杂度。下面是找出最大的k个数的快排思想:

定义函数 random_select(left, right, K) 表示划分数组points 的 [left,right] 区间,并且需要找到其中第 K个距离最小的点。在一次划分操作完成后,设 pivot 的下标为 i,即区间 [left,i−1] 中的点的距离都小于等于pivot,而区间 [i+1,right] 的点的距离都大于pivot。此时会有三种情况:

如果 K =i−left+1,那么说明 \textit{pivot}pivot 就是第 KK 个距离最小的点,我们可以结束整个过程;

如果 K < i−left+1,那么说明第 K 个距离最小的点在 pivot 左侧,因此递归调用 random_select(left, i - 1, K);

如果 K > i−left+1,那么说明第 K 个距离最小的点在pivot 右侧,因此递归调用 random_select(i + 1, right, K - (i - left + 1))。

在整个过程结束之后,第 K 个距离最小的点恰好就在数组 points 中的第 K 个位置,并且其左侧的所有点的距离都小于它。此时,我们就找到了前 K 个距离最小的点。

来源:力扣(LeetCode)-973题

ascii要记住数字是48,字母是64和96。

1625. 执行操作后字典序最小的字符串

十分惭愧,本以为一步贪心可以解决。。。写完发现还是要枚举。。注意下比较存储整型数的string大小,不需要stoi后再比较,可以直接用strcmp比较,因为字符串可能以“0”开头,无法转成整形。
下面给出力扣的题解。。。
class Solution {
int gcd(int x, int y) {
return y == 0 ? x : gcd(y, x % y);
}
public:
string findLexSmallestString(string s, int a, int b) {
int n = s.size();
string ans = s;
string t = s + s;
int ga = gcd(10, a), gb = gcd(n, b);

    // 奇偶通用的add操作
    auto add = [&](string &p, int pos) {
        int lo = p[pos] - '0', added = 0;
        for (int i = ga; i < 10; i += ga) {
            int c = (p[pos] - '0' + i) % 10;
            if (c < lo) {
                lo = c;
                added = i;
            }
        }
        if (added)
            for (int i = pos; i < n; i += 2)
                p[i] = '0' + (p[i] - '0' + added) % 10;
    };
    
    // rotate操作
    for (int i = 0; i < n; i += gb) {
        string p = t.substr(i, n);
        add(p, 1);
        if (gb % 2)
            add(p, 0);
        ans = min(ans, p);
    }
    return ans;
}

};
来源:力扣

442. 数组中重复的数据

这里看到数据量不大,我选择了桶排序,但题目要求不使用额外空间,这点并没有做到。以后数据量小要记得使用桶排序。
下面是力扣题解,时间和空间消耗都很小:这是个很巧妙地办法这是一个很巧妙地办法。

若要不占用额外空间,就要修改原本的数据,这点是应该想到的。如果想到这里再分析一下结合题目的条件“1 ≤ a[i] ≤ n ,数字只出现两次或一次”也是一个向这个解法引导的思路。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于力扣刷题C++常用操作,我可以给你一些常见的操作和技巧: 1. 使用 STL 容器和算法库:STL(Standard Template Library)是 C++ 标准库中的一个重要组成部分,包含了许多常用的容器和算法。在力扣刷题中,使用 STL 可以大大提高代码的效率和可读性。例如,vector 可以用来存储动态数组,sort 可以用来排序等等。 2. 使用 auto 关键字:auto 关键字可以自动推导变量类型,可以减少代码量和提高可读性。例如,auto x = 1; 可以自动推导出 x 的类型为 int。 3. 使用 lambda 表达式:lambda 表达式是 C++11 中引入的一种匿名函数,可以方便地定义一些简单的函数对象。在力扣刷题中,使用 lambda 表达式可以简化代码,例如在 sort 函数中自定义比较函数。 4. 使用位运算:位运算是一种高效的运算方式,在力扣刷题中经常会用到。例如,左移运算符 << 可以用来计算 2 的幂次方,右移运算符 >> 可以用来除以 2 等等。 5. 使用递归:递归是一种常见的算法思想,在力扣刷题中也经常会用到。例如,二叉树的遍历、链表的反转等等。 6. 使用 STL 中的 priority_queue:priority_queue 是 STL 中的一个容器,可以用来实现堆。在力扣刷题中,使用 priority_queue 可以方便地实现一些需要维护最大值或最小值的算法。 7. 使用 STL 中的 unordered_map:unordered_map 是 STL 中的一个容器,可以用来实现哈希表。在力扣刷题中,使用 unordered_map 可以方便地实现一些需要快速查找和插入的算法。 8. 使用 STL 中的 string:string 是 STL 中的一个容器,可以用来存储字符串。在力扣刷题中,使用 string 可以方便地处理字符串相关的问题。 9. 注意边界条件:在力扣刷题中,边界条件往往是解决问题的关键。需要仔细分析题目,考虑各种边界情况,避免出现错误。 10. 注意时间复杂度:在力扣刷题中,时间复杂度往往是评判代码优劣的重要指标。需要仔细分析算法的时间复杂度,并尽可能优化代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值