天池leetcode编程task1

1、移除元素

class Solution {
public:
    int removeElement(vector<int>& nums, int val) 
    {
        int right = nums.size();
        if(right == 0) return 0;
        else
        {
            int left = 0;
            while(left < right)
            {
                if(nums[left] == val)
                {
                    nums[left] = nums[right-1];
                    right--;
                }
                else
                {
                    left++;
                }
            }
            return left;
        }
    }
};
  • 基于双指针实现
    首先判断数组长度,若为0则直接return 0;
    然后获取左指针与右指针,当左指针值与 val 相同时,使用右指针值代替左指针,同时将右指针左移一位,若不相同,则左指针右移一位;
    当左右指针重合时,即遍历一遍数组,得到最终结果。

2、删除有序数组中的重复项

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int n = nums.size();
        if(n == 0){
            return 0;
        }
        else{
            int slow = 1, fast = 1;
            while(fast < n){
                if(nums[slow - 1] != nums[fast]){
                    nums[slow] = nums[fast];
                    slow++;
                }
                fast++;
            }
            return slow;
        }
    }
};
  • 基于双指针实现(数组升序排列)
    首先判断数组长度,若为0则直接return 0;
    然后赋值快慢指针(slow与fast同时从1取值意在避免出现fast超出n的取值情况),当慢指针-1值与快指针值不同时,使用慢指针值代替快指针值,同时将快慢指针同时右移一位,若不相同,则仅快指针右移一位;
    当快指针到达数组终点时,即遍历一遍数组(最多快慢指针各遍历一遍数组),得到最终结果。
    3、三数之和
class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> ans;
        int n = nums.size();
        if(n<3){
            return ans;
        }
        sort(nums.begin(), nums.end());
        for(int first = 0; first < n-2; first++){
            if(first > 0 && nums[first-1] == nums[first]){
                continue;
            }
            int third = n-1, target = -nums[first];
            for(int second = first+1; second < n-1; second++){
                if(second > first+1 && nums[second-1] == nums[second]){
                    continue;
                }
                while(second < third && nums[second] + nums[third]>target){
                    third--;
                }
                if(second == third){
                    break;
                }
                if(nums[second] + nums[third] == target){
                    ans.push_back({nums[first], nums[second], nums[third]});
                }
            }
        }
        return ans;
    }
};
  • 基于排序+双指针实现
    首先判断数组长度,若小于3则直接return 空;
    然后基于排序+双层循环+双指针寻找符合条件的三个数;
    第一步,对数组进行排序;
    第二步,对first进行循环,若下一次循环first的值与此前相同,则跳过本次循环;
    第三步,构建双指针,third指针从数组末尾向左移;second指针从first右一位向右移,若下一次循环second的值与此前相同,则跳过本次循环;
    第四步,此时处于第二层循环,已确定first,若first+second+third=0,则second+third=-first,因此,当second<third且second+third>-first,则左移third,直至不满足条件,然后判断second与third的大小,若second=third,说明最小的second+third的值仍大于-first,因此可结束循环;反之,若second+third的值等于-first,则保存结果;
    当双指针依次到达数组终点时,即各遍历一遍数组,得到最终结果。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LeetCode是一个著名的在线编程题库,可以帮助计算机程序员提升编程能力。LeetCode的题目涵盖了算法、数据结构、字符串、数组、链表等多个方面的知识,对于求职面试以及算法竞赛准备非常有帮助。 LeetCode上的编程题目分为简单、中等和困难三个难度级别。每个题目都有详细的题目描述、输入输出示例以及参考答案等内容。在解决每个问题时,我们需要仔细阅读题目,并根据题目要求提供正确的解答。 通常,我们需要使用编程语言如Python、C++等来实现解题思路。在编码之前,我们需要先分析问题,并找到合适的算法或数据结构来解决问题。一般来说,我们可以使用递归、迭代、动态规划等方法来解决常见的编程问题。 在LeetCode上,我们可以提交解答,并测试解答是否通过了所有的测试用例。如果通过了所有的测试用例,我们就可以得到题目的AC(Accepted)结果,并获得该题目的通过证书。如果没有通过所有的测试用例,我们可以检查自己的解答,查找解答中的错误或者不完善之处,并进行修改和优化。 总之,LeetCode编程题是一个优秀的学习和练习编程的平台。通过解答LeetCode上的编程题目,我们可以提升自己的编程能力,并且培养解决问题的思维方式。无论是求职面试还是算法竞赛,LeetCode编程题都是非常有帮助的资源。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值