day1
-
[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; } } -
[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
- 暴力解法,我还给遇到问题了。。。原因是我变量设置太多了绕太多弯了,numLength和变量j好好看看,尤其是控制变量j的前面不就是j-1用上了么。但是没考虑到双循环可通过快慢指针编程单循环降低时间复杂度。明天优化
本文来自博客园,作者:跬步瑶,转载请注明原文链接:https://www.cnblogs.com/deservee/p/16830192.html

浙公网安备 33010602011771号