力扣704.二分查找
易错点:
二分查找一定要注意while中是<还是<=; if(target<nums[middle]),right是等于middle-1还是middle 这涉及到二分查找有两种书写模式:左闭右闭和左闭右开(左开右闭其实也有,只是没人那么写) 如果选择了左闭右闭,那么书写代码的时候要贯彻始终,while中要写成<=才能代表区间的左闭右闭。又因为右端点是闭合的,所以当middle的值不等于target值的时候,我们下一段区间中不需要出现middle了,所以right就等于middle-1就行。 如果选择了左闭右开,那么书写代码的时候也要贯彻始终,while中要写成<才能代表左闭右开的右开!因为右端点是开的,所以等middle的值不等于target时,我们取right=middle,但是实际上这个middle的值不会被包含在新区间内。
左闭右闭:
int search(int* nums, int numsSize, int target){ int left=0; int right=numsSize-1; while(left<=right){ int middle=(left+right)/2; if(target<nums[middle]){ right=middle-1; } else if(target>nums[middle]){ left=middle+1; } else if(target==nums[middle]) return middle; } return -1; }
左闭右开:
int search(int* nums, int numsSize, int target){ int left=0; int right=numsSize;//因为区间取右开,所以right直接等于numsSize就行,因为这个值不会被算在我们的区间内。 while(left<right)//左闭右开 { int middle=(right+left)/2; if(nums[middle]<target) { left=middle+1; } else if(nums[middle]>target) { right=middle; } else if(target==nums[middle]) { return middle; } } return -1; }
力扣27.移除元素
题目:
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组
int removeElement(int* nums, int numsSize, int val){ int slow=0; for(int fast=0;fast<numsSize;fast++) { if(nums[fast]!=val) { nums[slow++]=nums[fast]; } } return slow; }
空间复杂度:空间复杂度分析 | 代码随想录 (programmercarl.com)
O(1)的空间复杂度就是不要开辟任何的额外空间。
O(n)空间复杂度就是一个数组的空间复杂度
空间复杂度是logn的情况确实有些特殊,其实是在递归的时候,会出现空间复杂度为logn的情况。