day1

  1. [0704二分查找]

    class Solution {
        public int search(int[] nums, int target) {
            for (int i = 0; i <= nums.length-1; i++){
                if (nums[i] == target)
                    return i;
            }
            return -1;
        }
    }
    
    • 注意数组下标从0开始;没有考虑到本题数组元素有序性、唯一性,尤其是唯一性》》》》随想录说要用二分查找,我就写了下面代码:
    class Solution {
        public int search(int[] nums, int target) {
            int left = 1;
            int right = nums.length;
            int mid = (left + right)/2;
            while(left <= right){
                if (nums[mid] == target)
                    return mid;
                if (nums[mid] < target)
                    left = mid + 1;
                else
                    right = mid - 1;
                mid = (left + right)/2;
            }
            return -1;
        }
    }
    
    • 其实一开始先想用的是for循环,每次都很少想到while,二者还是有区别的;而且还遇到超出时间限制的错误,发现其实就是在while 循环中少了一句对mid重新赋值的语句;但结果还是不对那是因为没有注意到数组下表默认是从0开始,也就是说如果要返回数组第一个元素下标的话,那么返回值是0而不是1;最后更改如下:
    class Solution {
        public int search(int[] nums, int target) {
            int left = 0;
            int right = nums.length-1;
            int mid = left + ((right - left) / 2); 
            while(left <= right){
                if (nums[mid] == target)
                    return mid;
                else if (nums[mid] < target)
                    left = mid + 1;
                else 
                    right = mid - 1;
                mid = left + ((right - left) / 2); 
            }
            return -1;
        }
    }
    
    • 根据代码随想录把mid赋值语句合并到while开头这一处,另外在一开始就判断一下target值是否本来就不在范围内,再完善一下:
    class Solution {
        public int search(int[] nums, int target) {
            if (target < nums[0] || target > nums[nums.length - 1]) {
                return -1;
            }
            int left = 0;
            int right = nums.length-1;
            while(left <= right){
                int mid = left + ((right - left) / 2); 
                if (nums[mid] == target)
                    return mid;
                else if (nums[mid] < target)
                    left = mid + 1;
                else 
                    right = mid - 1;
            }
            return -1;
        }
    }
    
  2. [027移除元素]

    class Solution {
        public int removeElement(int[] nums, int val) {
            int numLength= nums.length; 
            for (int i = 0; i <= numLength-1; i++) {
                if ( nums[i] == val ) {
                    for(int j = i+1; j <= numLength-1; j++){
                        nums[j-1] = nums[j];                    
                    } 
                    i--;
                    numLength--;                    
                }
            }
            return numLength;
        }
    }
    
    • 暴力解法,我还给遇到问题了。。。原因是我变量设置太多了绕太多弯了,numLength和变量j好好看看,尤其是控制变量j的前面不就是j-1用上了么。但是没考虑到双循环可通过快慢指针编程单循环降低时间复杂度。明天优化
      :)qly
posted @ 2022-10-26 21:42  跬步瑶  阅读(30)  评论(0)    收藏  举报