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;

}

};

相关推荐
baizhigangqw15 分钟前
启发式算法WebApp实验室:从搜索策略到群体智能的能力进阶
算法·启发式算法·web app
C雨后彩虹28 分钟前
最多等和不相交连续子序列
java·数据结构·算法·华为·面试
cpp_25011 小时前
P2347 [NOIP 1996 提高组] 砝码称重
数据结构·c++·算法·题解·洛谷·noip·背包dp
Hugh-Yu-1301231 小时前
二元一次方程组求解器c++代码
开发语言·c++·算法
编程大师哥2 小时前
C++类和对象
开发语言·c++·算法
加农炮手Jinx2 小时前
LeetCode 146. LRU Cache 题解
算法·leetcode·力扣
Rabitebla2 小时前
C++ 和 C 语言实现 Stack 对比
c语言·数据结构·c++·算法·排序算法
加农炮手Jinx2 小时前
LeetCode 128. Longest Consecutive Sequence 题解
算法·leetcode·力扣
旖-旎2 小时前
递归(汉诺塔问题)(1)
c++·学习·算法·leetcode·深度优先·递归
深邃-2 小时前
【数据结构与算法】-顺序表链表经典算法
java·c语言·数据结构·c++·算法·链表·html5