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;
}
};