代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素

704.二分查找

题目链接:leetcode

  • 思路:①设置一个指向中心位置的标识和两个左右指针

​ ②当左右指针符合正常顺序时,比较中心位置元素与目标元素值大小,根据大小适时更新中心位置标识

public  int search(int[] nums, int target) {
        int left,right,mid;
        left = 0;
        right = nums.length - 1;
        while(left <= right){
            mid = (left + right) / 2;  ///除以2放在里面
            if(nums[mid] > target){
                right = mid - 1;     //这注意是mid,不是right-=1
            }
            if(nums[mid] < target){
                left = mid + 1;
            }
            if(nums[mid] == target){
                return mid;
            }
        }
        return -1;
}

27.移除元素

题目链接:leetcode

这道题我一共写了三种解法,第一种和第二种思路相同,但是不是最优的;第三种解法参照随想录上的方法写的,感觉快慢指针的确好用!

  • 思路一: 快慢指针法

    ①设置一个快指针,依次遍历集合中的每一个元素,即将所有符合条件的元素前移,也保证了不会遗漏数据

    ②设置一个慢指针,根据快指针遍历结果,依次更新数组中前置元素

    这种方法类似于装卸货物,一个人在下面等,等上面的人筛选完货物之后运下来,按顺序放在特定位置

  • 思路二:暴力循环法

    ①设置一个变量,从前遍历到后

    ②设置sum变量,记录交换次数,即排除元素个数

    ③将需要排除的元素与最后有效位置(nums.length - sum)的元素交换位置,并对交换来的元素继续进行验证是否为要排除的元素;一直进行这个步骤,直到遍历到最后有效位置

public int removeElement(int[] nums, int val) {
        /**
         * 快慢指针
         * 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
         * 慢指针:指向更新 新数组下标的位置
         */
         int slowIndex = 0;
         for(int fastIndex = 0;fastIndex < nums.length;fastIndex++){
            if(nums[fastIndex] != val){
                //更新值
                nums[slowIndex] = nums[fastIndex];
                slowIndex++;
            }
         }
        return slowIndex; 
    }
    public int removeElement(int[] nums, int val) {

        //一步一步的解决
        /**
         * 1.暴力循环解法
         */
        //思路:遍历数组,如果值为val的元素,都移到数组最后面,这样确保最前面的元素为所求值
        int temp = 0;
        int sum = 0;//记录总交换次数,也即排除元素个数
        for (int i = 0; i < nums.length - sum; i++) {//控制交换范围
            if(nums[i] == val){
                temp = nums[i];
                nums[i] = nums[nums.length-1-sum];
                nums[nums.length-1-sum] = temp;

                i--;//保证再进行判断
                sum++;
            }
        }

        return nums.length - sum;

        // /**
        //  * 2.双指针法
        //  */    
        // int left = 0,right = nums.length - 1;//双指针
        // int sum = 0;//记录交换次数
        // int temp = 0;
        
        // while(left <= right){//指针相等也要判断是否值匹配,目的返回正确的排除次数  
        //     if(nums[left] == val){
        //         temp = nums[left];
        //         nums[left] = nums[right];
        //         nums[right] = temp;

        //         // left++;  这里left指针留在原地继续判断是否等于确定值
        //         right--;
        //         sum++;
        //     }else{
        //         left++;
        //     }
        // }

        // return nums.length - sum;
	}

你可能感兴趣的:(代码随想录一刷,算法,leetcode,数据结构)