第一题
第一眼想法
一开始感觉挺简单的,然后因为原来写题都是用Python、C,很少用Java所以第一时间还在想这个int [] nums是Java里面八大基础数据类型能不能直接像arraylist一样获取数组长度吗,后来发现int []也是有lengh方法的
思路:
Java采用了左闭右开的写法,Python采用了左闭右闭的写法,这里说一下左闭右闭,不管采用哪种方式,最重要的一点就在于考虑中间不变的梁,如果采用全闭的方式,那left,right都要是数组索引的范围内,所以right = len(nums)-1然后在while的条件里也仍然为left <= right
空间复杂度: ,时间复杂度
Java
class Solution {
public int search(int[] nums, int target) {
// 左闭右开写法 left < right
int left = 0;
int right = nums.length;
int mid= left + ((right-left) >> 1);;
while (left < right){
if (nums[mid] == target ){
return mid;
}else if (nums[mid]>target){
right = mid;
}
else{
left = mid+1;
}
mid = left + ((right-left) >> 1);
}
return -1;
}
}
Python
class Solution:
def search(self, nums: List[int], target: int) -> int:
# 左闭右闭的方式
left = 0
right = len(nums)-1
mid = (right-left)>>1
while left <= right:
if nums[mid] == target:
return mid
elif nums[mid] < target:
left = mid+1
else:
right = mid-1
mid = left + ((right-left)>>1)
return -1
本题收获
中间写python的左闭右闭的写法时候出现一直死循环,一步一步排查之后发现原来是因为mid = left + (right-left)>>1这句的执行顺序是先把left+(right-left)加一起之后再进行右移,对这个左移右移的执行顺序不了解
第二题:移除元素
题目链接sshttps://leetcode.cn/problems/remove-element/submissions/
思路
采用快慢双指针的方法,用快指针去寻找非val元素,找到之后填充到慢指针所指位置,然后慢指针再向后移动,慢指针指向的拥有是即将要更新的位置,但是这个位置的值是不是val是不确定的,如果是val,就算这时候是数组的最后一位,那么他最后的slow+=1也正好是最终的答案
Python代码
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
slow,fast = 0,0
length = len(nums)
while fast < length:
if nums[fast] != val:
nums[slow] = nums[fast]
slow += 1
fast += 1
return slow