时间复杂度为O(n)算法

时间复杂度为O(n)算法

双指针算法

(三种双指针算法:相向双指针(reverse:翻转字符串,判断回文数; two sum:两数之和、三数之和;partition:快速排序,颜色排序),背向双指针,同向双指针)

有效回文串 I

给定一个字符串,判断其是否为一个回文串。只考虑字母和数字,并忽略大小写。
https://www.lintcode.com/problem/415/

class Solution {
public:
  
    bool isPalindrome(string &s) {
        // write your code here
        int left = 0;
        int right = s.length()-1;
        while(left < right){
            while(left<right && !isalnum(s[right]))--right;			//isalnum 用于排出非字母和数字的符号
            while(left<right && !isalnum(s[left]))++left;
            if(left<right ){
                if(tolower(s[left]) == tolower(s[right])){
                    --right;
                     ++left;
                }else return false;
            }
        }
       return true;
    }
};

有效回文串 II

给一个非空字符串 s,你最多可以删除一个字符。判断是否可以把它变成回文串

class Solution {
public:
    /**
     * @param s: a string
     * @return: whether you can make s a palindrome by deleting at most one character
     */
    bool validPalindrome(string &s) {
        // Write your code here
        int left =0;
        int right = s.length()-1;
        while(left < right){

            if(s[left] != s[right]){
               return Palindrome(s,left+1,right)||Palindrome(s,left,right-1);
            }
            left++;
            right--;
        }
       return true;

    }
    bool  Palindrome(string &s,int left,int right){
         while(left < right){
            if(left < right && s[left] != s[right]){
                return false;
            }
            left++;
            right--;
        }
       return true;
    } 
};

两整数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/two-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

哈希表解法

时间复杂度和空间复杂度均为O(n)

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        
        map<int,int> counters;
        int len = nums.size();
        for(int i=1; i<len; i++){
            map<int,int>::iterator temp = counters.find(target-nums[i]);
            if(temp != counters.end()){
                return {temp->second,i};
            }
            counters[nums[i]] = i;
        }
        return {};
    }
};
双指针做法

如果最开始数组有序,可以利用 数组最大值+最小值和target的关系进行筛选,这样空间复杂度直接降到1,但是如果没有序的话,就要对原值进行排序,所浪费的空间和时间比起哈希表来讲,得不偿失。


后续更新:
打擂台算法
单调栈算法
单调队列算法

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Warm wolf

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

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

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

打赏作者

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

抵扣说明:

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

余额充值