力扣704二分查找
int mid=(right-left)/2+left;
//不用(left+right)是因为当left和right很大的时候,相加可能会导致溢出,而right-left之后再加上left可以减少溢出的可能性
if(target>nums[mid])
left=mid;
else if(target<nums[mid])
right=mid;
//当时第一次是这样写的,我清楚边界出现问题,但是我在想即使mid 不被包含但是那有怎样,下次就可以更新了left和right,我模拟了一下寻找元素的left和right,发现正常。但是!!!如果要找的target不在数组中呢?能保证返回-1吗?举个例子:
[-1,0,3,5,9,12]寻找2:
与3比 | 与0比 | 与0比 | 与0比 | |
left | 0 | 0 | 1 | 1 |
right | 5 | 2 | 2 | 2 |
mid | 2 | 1 | 1 | 1 |
可见如果使用错误的边界,那么就会无限循环,超出时间限制!!所以不要忽略编程中的小错误,小问题不解决大问题更加麻烦!!
力扣27移除元素
1.看到题目“返回相同元素去除之后的列表元素个数”,我想如果使用python,直接list.count(val)算出有几个重复元素val,再使用len(list)相减不就可以?但是不要忽略题头给定是list的引用,因为结果会检验。
2.第一次用python没写清楚,主要是深刻理解“双指针”,“双指针”中一个指针指示原来的数组中的元素,新指针指向新数组中的元素,根据要求把新数组赋值给原数组。
力扣977有序数组的平方
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
for i in range(len(nums)):
if nums[i]<0:
a=0-nums[i]
nums[i]=a
nums.sort(key=None,reverse=False)#升序
for i in range(len(nums)):
nums[i]=nums[i]*nums[i]
return nums
1.使用暴力排序,代码如上,用python列表list中的属性,list.sort(key=None,reverse=False),key表示要对比的元素,reverse=True表示降序,reverse=False表示升序。
2.使用双指针排序,前提是分析出最终大的元素都集中在数组两端。这次“双指针”的使用不同于27,本题两个指针ij分别指向原数组首尾,第三个指针k指向新数组result的尾元素。依次比对最大元素,然后赋值给result中的k,k--。为什么不把k初值指向初始元素呢?因为我们比较结果是最大元素!!
3.注意双指针的运用方式多样化,双指针指向数组的位置并没有一个定论,要具体问题具体分析,但是可以肯定的一点是,运用在数组排序问题比较常见。