get+二分|数位dp

lc1088

dfs从0开始生成由0、1、6、8、9组成的数

同时生成其翻转数,统计≤N且自身和翻转数不相等的数的数量

num 是当前生成的数

rev_num 是它的翻转数

base 是翻转数的位数权重(用来计算翻转数)

也可以直接套灵神模板写

class Solution {

public:

int ans = 0;

int N;

int digit[5]={0,1,6,8,9};

int rev_digit[5] = {0,1,9,8,6};

void dfs(int num,long rev_num,long base)

{

++if(num<=N){++

++if(num!=rev_num)++

ans++;

if(num>N/10)

return;

++for(int i =base==1?1:0;i<5;i++){++

++dfs(num*10+digit[i],rev_num+base*rev_digit[i],base*10);++

++}++

}

else

return;

}

int confusingNumberII(int N) {

this->N = N;

this->ans = 0;

dfs(0,0,1);

return ans;

}

};

lc2340

灵性等号

找最小数位置和最大数位置

算它们到两端的交换次数,若最小数在最大数右边就减1次重复操作,结果就是最少交换次数

class Solution {

/*

输入: nums = [3,4,5,5,3,1]

输出: 6

*/

public:

int minimumSwaps(vector<int>& nums)

{

int n=nums.size();

if(n==1) return 0;

int mn=0,mx=0;

for(int i=0;i<n;i++)

{

if(nums[i]<nums[mn])

mn=i;

if(nums[i]>=nums[mx])

mx=i;

}

int ret=mn+(n-1-mx);

++if(mn>mx) ret-=1;++

return ret;

}

};

lc2674

快慢指针

++while (f->next != list && f->next->next != list)++

得到的slow节点 中/偏前

ListNode* second = s->next;

// 后半 头节点

class Solution {

public:

vector<ListNode*> splitCircularLinkedList(ListNode* list)

{

vector<ListNode*> ret;

ListNode* s = list;

ListNode* f = list;

//f->next != list && f->next->next != list

++while (f->next != list && f->next->next != list)++

{

f = f->next->next;

s = s->next;

}

ListNode* second = s->next;

// 后半 头节点

s->next = list; // 前半 循环

ListNode* tail = second;

while (tail->next != list)

tail = tail->next;

tail->next = second;//后半 循环

return {list, second};

}

};

lc1428

逐行对每行链表用二分找首个1的列号

取所有行结果的最小列号,无1则返回-1。

class Solution {

public:

int leftMostColumnWithOne(BinaryMatrix &m) {

auto d = m.dimensions();

int r = d[0], c = d[1], res = -1;

auto bs = [&](int i, int r) {

int l = 0, k = -1;

while (l <= r)

{

int mid = l + ((r - l) >> 1);

++if (m.get(i, mid) == 0)++

l = mid + 1;

else

{

k = mid;

r = mid - 1;

}

}

return k;

};

for (int i = 0; i < r; i++) {

++int k = bs(i, c - 1);++

if (k >= 0) {

if (res == -1)

res = k;

else

res = min(res, k);

}

}

return res;

}

};

相关推荐
炽烈小老头1 分钟前
【 每天学习一点算法 2026/03/25】在排序数组中查找元素的第一个和最后一个位置
学习·算法
刀法如飞3 分钟前
AI时代,重温10大经典排序算法的思维
算法·排序算法·ai编程
啊我不会诶7 分钟前
求LCA 倍增法
c++·算法·深度优先
CoderIsArt8 分钟前
编译器构建中涉及的算法
数据库·算法
暮冬-  Gentle°8 分钟前
编译器优化屏障使用
开发语言·c++·算法
云淡风轻~窗明几净12 分钟前
关于TSP的海岸线猜想:SeaLine算法的逐层法(不同于逐点法)
数据结构·算法·动态规划·模拟退火算法
刀法如飞12 分钟前
AI时代,重温10大经典排序算法
算法·排序算法·ai编程
m0_7301151118 分钟前
模板编程中的SFINAE技巧
开发语言·c++·算法
NAGNIP25 分钟前
面试官:给我讲一下卷积吧!
算法·面试
2401_8318249629 分钟前
高性能计算集群部署
开发语言·c++·算法