力扣刷题记录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
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值