leetcode刷题详解一

preview

算法题常用API

std::accumulate

函数原型:

template< class InputIt, class T >
T accumulate( InputIt first, InputIt last, T init );

一般求和的,代码如下:

int sum = accumulate(vec.begin() , vec.end() , 0);

详细用法参考

lower_bound()

int lower_bound(起始地址,结束地址,要查找的数值) 返回的是数值 第一个等于某元素 的位置。

int index = upper_bound(vec.begin(), vec.end(), target) - vec.begin()

功能:函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于target的第一个元素位置。如果所有元素都小于target,则返回last的位置,因为是前闭后开因此这个时候的last会越界,要注意。

找不到返回nums.end()

upper_bound()

int upper_bound(起始地址,结束地址,要查找的数值) 返回的是数值 第一个大于某个元素 的位置。

int index = upper_bound(vec.begin(), vec.end(), target) - vec.begin();

功能:函数upper_bound()返回的在前闭后开区间查找的关键字的上界,返回大于target的第一个元素位置。注意:返回查找元素的最后一个可安插位置,也就是“元素值>查找值”的第一个元素的位置。同样,如果target大于数组中全部元素,返回的是last。(注意:数组下标越界)

binary_search()

bool binary_search(起始地址,结束地址,要查找的数值) 返回的是 是否存在 这么一个数,是一个bool值。

功能: 在数组中以二分法检索的方式查找,若在数组(要求数组元素非递减)中查找到indx元素则真,若查找不到则返回值为假。

priority_queue

template<
    class T,
    class Container = std::vector<T>,
    class Compare = std::less<typename Container::value_type>
> class priority_queue;

默认container是vector。

默认compare策略是less。因为默认是大顶堆,首先输出最大元素,所以最开始来的元素最后才输出。记住大顶堆比较策略是std::less<T>,小顶堆的比较策略是std::greater<T>

atoi

int atoi( const char *str );

将char*的字符串转化成整数

min和max

包含在c++标准库中头文件<algorithm>

std::min(const T& a, const T& b);
std::max(const T& a, const T& b);
//或者自己写comp函数
const T& min (const T& a, const T& b, Compare comp);

//自定义compare函数如下
static bool compare(const string& s1, const string& s2)
{
    string ab = s1 + s2;
    string ba = s2 + s1;
    return ab < ba; //升序排列。如改为ab > ba, 则为降序排列
}
 

数据结构

链表类型

234. 回文链表

**思路:**回文串是对称的,所以正着读和倒着读应该是一样的,这一特点是解决回文串问题的关键。单链表无法倒着遍历,无法使用双指针技巧。

  • 方法一,把链表节点放入栈中再拿出和原来的链表比较。算法的时间和空间复杂度都是 O(N)

    class Solution {
    public:
        bool isPalindrome(ListNode* head) {  
            stack<int> rec;
            ListNode *temp = head;
            while(temp){
                rec.push(temp->val);
                temp = temp->next;
            }
            while(!rec.empty()||head){
                if(head->val == rec.top()){
                    head = head->next;
                    rec.pop();
                }else{
                    return false;
                }  
            }
            return true;
        }
    };
    
  • 方法二

    **利用双指针的快慢指针的思想,找出链表的中间节点。**双指针的条件是while(fast!=null && fast->next!=null)

    然后要分清楚链表是双数还是单数。如果fast==null,表明是偶数链表,否则是奇数链表

    双指针找中点+反转一部分节点

img
bool isPalindrome(ListNode* head) {  
    ListNode* slow = head;
    ListNode* fast = head;
    while(fast && fast->next){
        slow = slow->next;
        fast = fast->next->next;
    }
    //fast=nullptr说明是偶数链表
    //fast!=nullptr说明是奇数链表
    ListNode* tail = reverse(slow);
    ListNode* front = head;
    while(tail || tail == slow){
        if(front->val == tail->val){
            front = front->next;
            tail = tail->next;
        }else{
            return false;
        }
    }
    return true;
}
ListNode* reverse(ListNode* node){
    if(!node || !node->next){
        return node;
    }
    ListNode* tmp = reverse(node->next);
    node->next->next = node;
    node->next = nullptr;
    return tmp;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Make程序设计

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值