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;

}

};

相关推荐
VT.馒头2 分钟前
【力扣】2695. 包装数组
前端·javascript·算法·leetcode·职场和发展·typescript
CoderCodingNo2 小时前
【GESP】C++五级练习题 luogu-P1865 A % B Problem
开发语言·c++·算法
大闲在人2 小时前
7. 供应链与制造过程术语:“周期时间”
算法·供应链管理·智能制造·工业工程
小熳芋2 小时前
443. 压缩字符串-python-双指针
算法
Charlie_lll2 小时前
力扣解题-移动零
后端·算法·leetcode
chaser&upper2 小时前
矩阵革命:在 AtomGit 解码 CANN ops-nn 如何构建 AIGC 的“线性基石”
程序人生·算法
weixin_499771552 小时前
C++中的组合模式
开发语言·c++·算法
iAkuya3 小时前
(leetcode)力扣100 62N皇后问题 (普通回溯(使用set存储),位运算回溯)
算法·leetcode·职场和发展
近津薪荼3 小时前
dfs专题5——(二叉搜索树中第 K 小的元素)
c++·学习·算法·深度优先
xiaoye-duck3 小时前
吃透 C++ STL list:从基础使用到特性对比,解锁链表容器高效用法
c++·算法·stl