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;

}

};

相关推荐
sin_hielo2 小时前
leetcode 2147
数据结构·算法·leetcode
萌>__<新2 小时前
力扣打卡每日一题——缺失的第一个正数
数据结构·算法·leetcode
DuHz2 小时前
车对车对向交汇场景的毫米波路径损耗建模论文精读
论文阅读·算法·汽车·信息与通信·信号处理
lxh01132 小时前
二叉树中的最大路径和
前端·算法·js
萌>__<新2 小时前
力扣打卡每日一题————零钱兑换
算法·leetcode·职场和发展
重生之后端学习2 小时前
238. 除自身以外数组的乘积
java·数据结构·算法·leetcode·职场和发展·哈希算法
yaoxin5211232 小时前
269. Java Stream API - Map-Filter-Reduce算法模型
java·python·算法
Learner__Q3 小时前
每天五分钟:动态规划-LeetCode高频题_day2
算法·leetcode·动态规划
一韦以航.3 小时前
C【指针】详解(上)
c语言·数据结构·c++·算法