记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步
目录
- 1/27 45. 跳跃游戏 II
- 1/28 119. 杨辉三角 II
- 1/29 219. 存在重复元素 II
- 1/30 350. 两个数组的交集 II
- 1/31 541. 反转字符串 II
- 2/1 81. 搜索旋转排序数组 II
- 2/2 598. 区间加法 II
1/27 45. 跳跃游戏 II
题目说明一定可以跳到队末 要次数最少
找到跳到队尾的最靠前的一个点 将队尾移到这个点 跳动次数+1 pos记录当前的地址
反复寻找
begin用来记录重新开始寻找的点
如果开头是1则直接进行跳跃 次数+1 begin+1 及略过开头若干个1
python">def jump(nums):""":type nums: List[int]:rtype: int"""begin = 0pos = 0 num = 0l = len(nums)if l<2:return numwhile True:while nums[pos]==1:pos+=1if pos==l-1:breaknum+=1begin = poswhile pos+nums[pos]<l-1:pos+=1num +=1if pos==begin or pos==l-1:breakl = pos+1pos = beginreturn num
1/28 119. 杨辉三角 II
按规则生成
python">def getRow(rowIndex):""":type rowIndex: int:rtype: List[int]"""if rowIndex==0:return [1]elif rowIndex==1:return [1,1]pre = [1,1]ind = 1while ind<rowIndex:ind+=1cur = [1]for i in range(len(pre)-1):cur.append(pre[i]+pre[i+1])cur.append(1)pre=cur[:]return cur
1/29 219. 存在重复元素 II
滑动窗口 保持k+1长度 记录长度内出现的数字个数
如果数字个数大于1 则成立
python">def containsNearbyDuplicate( nums, k):""":type nums: List[int]:type k: int:rtype: bool"""from collections import defaultdictwin = defaultdict(int)for i in range(min(len(nums),k+1)):win[nums[i]]+=1if win[nums[i]]>1:return Truefor i in range(k+1,len(nums)):win[nums[i-k-1]]-=1win[nums[i]]+=1if win[nums[i]]>1:return Truereturn False
1/30 350. 两个数组的交集 II
ans1: 接349 获取不重复的交集l
遍历l中的元素
找到两个集合中该元素出现最少的次数 添加进答案
ans2: 将第一个集合编成 字符-次数 的字典 遍历第二个集合
如果某一个字符在字典中并且次数不为0 则加入 字典中的次数减一
python">from collections import defaultdictdef intersect(nums1, nums2):""":type nums1: List[int]:type nums2: List[int]:rtype: List[int]"""n1=set(nums1)n2=set(nums2)l = list(n1&n2)res=[]for x in l:num = min(nums1.count(x),nums2.count(x))res.extend([x]*num)return resdef intersect2(nums1, nums2):""":type nums1: List[int]:type nums2: List[int]:rtype: List[int]"""d = defaultdict(int)res=[]for i in nums1:d[i]+=1for i in nums2:if d[i]>0:res.append(i)d[i]-=1return res
1/31 541. 反转字符串 II
l,r代表需要反正的字符段左右
l需要小于s的长度 r为l+k-1和长度n-1之间的较小值
下一个l为之前r+k+1
python">def reverseStr(s, k):""":type s: str:type k: int:rtype: str"""n = len(s)ls= list(s)l = 0while l<n:r = min(l+k-1,n-1)tmp = rwhile l<r:ls[l],ls[r]=ls[r],ls[l]l+=1r-=1l = tmp+k+1return ''.join(ls)
2/1 81. 搜索旋转排序数组 II
找到当前旋转的位置 nums[n-1]>=nums[0]
恢复原来顺序 再进行二分查找
python">def search(nums, target):""":type nums: List[int]:type target: int:rtype: bool"""def find(nums):l,r = 0,len(nums)-1while l<=r:mid = l +(r-l)//2if nums[mid]==target:return Trueelif nums[mid]<target:l = mid+1else:r = mid-1return Falseif len(nums)==1:return nums[0]==targetif len(nums)==2:return nums[0]==target or nums[1]==targetif nums[0]<nums[-1]:return find(nums)for i in range(1,len(nums)):if nums[i]<nums[i-1]:return find(nums[i:]+nums[:i])return False
2/2 598. 区间加法 II
最大整数即为每次都加到的区间
遍历记录x,y的最小值
python">def maxCount(m, n, ops):""":type m: int:type n: int:type ops: List[List[int]]:rtype: int"""curx,cury=m,nfor x,y in ops:curx = min(curx,x)cury = min(cury,y)return curx*cury