代码随想录训练营day1| 704 二分查找,27 移除元素

LeetCode 704 二分查找

思路:解法也简单明了,用二分查找的方式解决,需要注意的是题目已经将数组按找升序排好了,不需要自己再排一篇,但在其他题目中用二分查找方式需要注意排序

附上代码: 

class Solution {
public:
    int search(vector& nums, int target) {
        int left=0;
        int right=nums.size()-1;
        while(left<= right){
            int middle=(left+right)/2;
            if(nums[middle]>target){
                right=middle-1;
            }else if(nums[middle]

        最开始的时候我while跳转条件写的是 left != right ,答案错误了,之后发现是left == right 的时候也需要循环一次,比如数据为一个nums={5}target=5,显然left == right 有意义,还有这里我试过将right = middle - 1-1left = middle + 1+1去掉,发现都超时了,这也是需要注意的点。 


LeedCode 27 移除元素

1. 暴力解法

 思路:两层for循环,第一个for循环遍历数组 ,第二个for循环更新数组。

class Solution {
public:
    int removeElement(vector& nums, int val) {
        int length = nums.size();
        for(int i=0;i

时间复杂度:O(n^{2})

空间复杂度:O(1)

        开始我使用了一个n=length来标记最终数组长度,最后发现有点冗余,用length--也能替代,还有注意j的下标是从i+1开始,由后一位赋值前一位。也要注意到i--,因为i以后的数值都向前移动了一位,下一次要重新从i开始循环。 

2.双指指针法

思路:用快慢指针,快指针遍历数组,慢指针更新数组。

class Solution {
public:
    int removeElement(vector& nums, int val) {
        int length = nums.size();
        int fast,slow;
        for( fast=0,slow=0;fast

 时间复杂度:O(n)

空间复杂度:O(1)

        快慢指针的想法也比较简单了,这种方法在数组和链表里面很常见,要牢牢掌握。

你可能感兴趣的:(算法,leetcode)