代码随想录算法训练营第三天| LeetCode 203.移除链表元素、 LeetCode 707.设计链表、 LeetCode 206.反转链表

203.移除链表元素

题目链接 203.移除链表元素
双指针

left>0之后其实可以不用交换了,但这样代码又会更复杂一些

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        int left = 0;
        int right = nums.size()-1;
        int index = right;
        vector<int> result(nums.size(), 0);
        while(left <= right){
             if(nums[left]*nums[left]<=nums[right]*nums[right]){
                 result[index--] = nums[right]*nums[right];
                 --right;
             }else{
                 result[index--] = nums[left]*nums[left];
                 ++left;
             }
        }
        return result;
    }
};
左闭右闭
class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size()-1;
        while(left <= right){
            int middle = left + ((right-left)>>1);//用加法避免溢出
            if(nums[middle] < target){
                left = middle+1;
            }else if(nums[middle] > target){
                right = middle-1;
            }else{
                return middle;
            }
        }
        return -1;

    }
};

只更改了

int right = nums.size()-1;//right也在区间内,而c++数组从0开始
else if(nums[middle] > target){
                right = middle-1;//middle>target不用再纳入[left,right]目标区间
            }

LeetCode27. 移除元素

题目链接 27. 移除元素
双指针法

因为题目要求的输出可以是任意顺序,使用的是自己写的交换法

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int left = 0;
        int right = nums.size() - 1;
        while (left <= right){         //取等号则可以避免长度为0和1的数组出现问题
            if(nums[left] == val){
            swap(nums[left], nums[right]);
            --right;
            }else{
                ++left;
            }
        }
        return left;             //返回left在长度为0和1的数组时不会越界
    }

};
快慢指针法

slow相当于用一个空数组记录fast遍历过的不等于val的数组

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int slow = 0;
        for(int fast = 0; fast < nums.size(); ++fast){
            if(nums[fast] != val){
                nums[slow++] = nums[fast];
            }
        }
        return slow;
    }

};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值