题目来源于知识星球—英雄算法联盟,七月算法集训专题
跟随英雄算法联盟博主—英雄哪里出来,每天完成相应的算法练习,一个月后,必定会有所成长!
分治算法也很经典了,但是我当初学的时候可谓是一头雾水,迷迷糊糊的!
今天的题和五月集训的题一样,算是回顾了!
先考虑存在链表为空链表的情况,如果有其中一个链表为空链表,则直接返回
另一个非空链表。当两个链表都不为空时,用递归方法取值较小的放在前面,
next指针继续计算。
class Solution
{
public:
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2)
{
if(list1 == nullptr)
{
return list2;
}
else if(list2 == nullptr)
{
return list1;
}
ListNode *t = new ListNode();
if(list1->val < list2->val)
{
t->val = list1->val;
t->next = mergeTwoLists(list1->next, list2);
}
else
{
t->val = list2->val;
t->next = mergeTwoLists(list1, list2->next);
}
return t;
}
};
这道题的本质为将字符串数组进行排序,然后找到第K大的整数,首先将
字符串长的放到前面,如果字符串长度相同,那么进行降序排列,最后
返回第k大的元素。
class Solution
{
public:
static bool cmp (string &a, string &b)
{
if(a.size()==b.size()) return a>b;
return a.size() > b.size();
}
string kthLargestNumber(vector<string>& nums, int k)
{
sort(nums.begin(), nums.end(),cmp);
return nums[k-1];
}
};
以后再来刷
等式左边是偶数,那么右边为奇数可以保证永不相等。
可以将A[i]映射为奇数,A[j]映射为偶数。问题转化为,左区间映射为奇数,有区间映射为偶数,
由于漂亮数组经过k*a+b的变化后,仍然是漂亮数组。
因此,可以分解成若干子问题,用分治求解。
class Solution
{
public:
vector<int> beautifulArray(int n)
{
vector<int> ans;
if(n==1)
{
ans.push_back(1);
return ans;
}
int odd_num=(n+1)/2;
int even_num=n/2;
vector<int> left_arry=beautifulArray(odd_num);
vector<int> right_arry=beautifulArray(even_num);
//将左侧数组映射为奇数
for(auto &val:left_arry)
{
ans.push_back(val*2-1);
}
//将右侧数组映射为偶数
for(auto &val:right_arry)
{
ans.push_back(val*2);
}
return ans;
}
};
每天跟随英雄哥学习相关的算法,一个月会收获很多,如果你想了解更多关于知识星球的内容,欢迎联系我!