当前位置: 首页 > news >正文

9.21 快速选择

 

 

lcr001

递归+倍增 实现整数除法

 

先处理正负号和边界情况(如除数为±1、结果溢出)

再通过每次将除数翻倍来快速计算商

避免直接循环相减效率低

class Solution {
public:
//利用减法实现除法 均已保证传入的a,b是负数  
unsigned int div(int a, int b) {
int res=0;
while(a<=b){//a的绝对值大
int temp=b;
unsigned int count=1;//a的绝对值大于b的 那么肯定a能减一次b
while(temp>=0xc0000000&&a<=temp+temp){//减数不越界方便控制后一个条件:且a的绝对值比两倍的减数还大
count+=count;//可以减的次数翻倍
temp+=temp;//减数也翻倍
}
res+=count;
a-=temp;
}
return res;
}

    int divide(int a, int b) {
if (a == INT_MIN && b == -1) {
return INT_MAX;
}
bool positive=true;
if (a > 0) {
positive=!positive;
a = -a;
}
if (b > 0) {
positive=!positive;
b = -b;
}
unsigned int res = div(a, b);
return positive? res : -res;
}
};

 

 

 

lc1496

set<string> visited;
visited.insert("0,0");

class Solution {
public:
bool isPathCrossing(string path) {
int x = 0, y = 0;
// 使用集合存储已经走过的位置
set<string> visited;
visited.insert("0,0");


for (auto& p : path) {
if (p == 'N')
y++;
else if (p == 'S')
y--;
else if (p == 'W')
x--;
else
x++;


// 生成当前位置的字符串表示
string pos = to_string(x) + "," + to_string(y);

if (visited.count(pos))
return true;
visited.insert(pos);
}
return false;
}
};

 

lcp40.

sort+反悔贪心

 

选最大的 cnt  个数求和,若和为偶数直接返回;

若为奇数,就换前 cnt  个里最小的奇(偶)数与后面最大的偶(奇)数,取两种换法里的最大值。

 class Solution {

public:

    int maximumScore(vector<int>& cards, int cnt) {

        ranges::sort(cards, greater());

        int s = reduce(cards.begin(), cards.begin() + cnt); // 最大的 cnt 个数之和

        if (s % 2 == 0) { // s 是偶数

            return s;

        }

 

        auto replaced_sum = [&](int x) -> int {

            for (int i = cnt; i < cards.size(); i++) {

                if (cards[i] % 2 != x % 2) { // 找到一个最大的奇偶性和 x 不同的数

                    return s - x + cards[i]; // 用 cards[i] 替换 s

                }

            }

            return 0;

        };

 

        int x = cards[cnt - 1];

        int ans = replaced_sum(x); // 替换 x

        for (int i = cnt - 2; i >= 0; i--) { // 前 cnt-1 个数

            if (cards[i] % 2 != x % 2) { // 找到一个最小的奇偶性和 x 不同的数

                ans = max(ans, replaced_sum(cards[i])); // 替换

                break;

            }

        }

        return ans;

    }

};

快速选择

找数组中第k大(小)的元素,不用整体排序,更高效

class Solution {

public:

    int maximumScore(vector<int>& cards, int cnt) {

        ranges::nth_element(cards, cards.end() - cnt); // 快速选择

        int s = reduce(cards.end() - cnt, cards.end()); // 最大的 cnt 个数之和

        if (s % 2 == 0) { // s 是偶数

            return s;

        }

 

        int n = cards.size();

        // 加进来的最大偶数/奇数

        int mx[2] = {INT_MIN / 2, INT_MIN / 2}; // 除 2 防止最下面减法溢出

        for (int i = 0; i < n - cnt; i++) {

            int v = cards[i];

            mx[v % 2] = max(mx[v % 2], v);

        }

 

        // 要去掉的最小偶数/奇数

        int mn[2] = {INT_MAX / 2, INT_MAX / 2};

        for (int i = n - cnt; i < n; i++) {

            int v = cards[i];

            mn[v % 2] = min(mn[v % 2], v);

        }

 

        return max(s + max(mx[0] - mn[1], mx[1] - mn[0]), 0);

    }

};

 

http://www.dtcms.com/a/393035.html

相关文章:

  • 【常见集合】HashMap
  • Docker安装小白教程(阿里yum)
  • MySQL表结构变更详解:ALTER TABLE ADD COLUMN语法、最佳实践与避坑指南
  • 【LeetCode - 每日1题】设计电子表格
  • Spring 中 REQUIRED 事务的回滚机制详解
  • C++框架中基类修改导致兼容性问题的深度分析与总结
  • 学习笔记-SpringBoot项目配置
  • Java数据结构——时间和空间复杂度
  • 如何在接手新项目时快速上手?
  • Zynq开发实践(SDK之自定义IP2)
  • 数据库相关锻炼
  • PostgreSQL 入门与实践
  • pytorch基本运算-PyTorch.Tensor张量数据类型
  • 数据结构与算法 第三章 栈
  • Spring Boot 整合 MyBatis:从入门到企业级实践
  • FHook Java 层全函数 HOOK 框架
  • TDengine 聚合函数 STDDEV_POP 用户手册
  • 【 嵌入式Linux应用开发项目 | Rockit + FFmpeg+ Nginx】基于泰山派的IPC网络摄像头
  • 机器学习中的高准确、低召回
  • Go基础:Go基本数据类型详解
  • 项目管理(一)
  • 【STM8L101 执行函数FLASH_ProgramBlock出现问题】
  • ​​[硬件电路-278]:双向双电源电平转换收发器74AXP2T45DCH功能概述、管脚定义
  • 音视频同步的原理和实现方式
  • BUG调试案例十八:TPS5430输出震荡问题案例
  • Python读取Excel文件里面指定列中的指定范围行
  • C语言入门教程 | 阶段二:控制结构详解(条件语句与 switch 语句)
  • Linux 4.x hook系统调用的问题
  • 了解 Highcharts 响应式功能:构建适配各种屏幕的图表界面
  • 逻辑分析仪解码脚本实例解析——UART