前言:數組
今天給本身開一個坑,100Days of 100 line Code。在接下來的一百天裏面,天天保持100行的有效代碼量,並講思路和錯誤寫在博客上面。app
固然,日期可能不是一百天,代碼也不會只是100行。ide
但願本身堅持。spa
-------------------------------------------------------------------------------------------------------------------------------------指針
LeetCode #1 兩數之和code
題目連接:https://leetcode-cn.com/problems/two-sum/description/blog
代碼:排序
class Solution: def twoSum(self, nums, target): new_dict = {} # 建立儲存結果字典 for i in range(len(nums)): # 遍歷列表的全部元素 new_dict[target - nums[i]] = i # 將target-i做爲key,i做爲value,儲存到字典內 for i in range(len(nums)): if nums[i] in new_dict and new_dict[nums[i]] != i: # 判斷i是否在儲存結果的字典內,且i不等於target-i return [i, new_dict[nums[i]]] nums = [2,7,15,11] target = 9 Solution.twoSum(0,nums,target)
LeetCode #4 兩個排序數組的中位數索引
題目連接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/description/three
代碼:
class Solution: def findMedianSortedArrays(self, nums1, nums2): new_nums = [] # 建立新數組 ''' 兩個循環將數組合並 ''' for i in range(len(nums1)): new_nums.append(nums1[i]) for i in range(len(nums2)): new_nums.append(nums2[i]) new_nums.sort() # 對合並數組進行排序處理 mid = int(len(new_nums)/2) # 取出新數組中間值的索引 if len(new_nums)%2 == 0: # 對數組進行判斷,是不是偶數 rmid = (new_nums[mid] + new_nums[mid-1])/2 # 爲偶數 中位數則爲兩數之和的除數 else : rmid = new_nums[mid] return float(rmid) nums1 = [1,3] nums2 = [2] s=Solution() print (s.findMedianSortedArrays(nums1,nums2))
LeetCode #11盛最多水的容器
題目連接:https://leetcode-cn.com/problems/container-with-most-water/description/
代碼:
暴力解法:
對每一個頂點進行遍歷
class Solution: def maxArea(self, height): new_area = [] # 建立新數組,儲存面積 for i in range(len(height)): # 遍歷全部的座標點height[i] for j in range(i+1,len(height)): # 遍歷與height[i]對應的因此座標點height[j] if height[i]>=height[j]: # 判斷高度 高度以低的爲ture new_area.append(height[j]*(j-i)) # 計算面積並儲存到new_area數組 else : new_area.append(height[i]*(j-i)) new_area.sort() # 對儲存面積的數組進行排序 獲得最大值 return new_area[len(new_area)-1] height = [5,4,3,2,1] s=Solution() print(s.maxArea(height))
二分法
從兩頭開始往中間開始遍歷
class Solution: def maxArea(self, height): left = 0 right = len(height)-1 area = 0 while left < right: if height[left] >= height[right]: if area < height[right]*(right-left): # 判斷 左頂點指針高度是否大於右頂點指針高度, 面積指針是否大於當前頂點指針面積 area = height[right]*(right-left) # 對面積指針進行更新 right -= 1 # 對左頂點指針進行更新 else : if area < height[left]*(right-left): # 判斷 左頂點指針高度是否小於右頂點指針高度, 面積指針是否大於當前頂點指針面積 area = height[left]*(right-left) left += 1 return area height = [1, 8, 6, 2, 5, 4, 8, 12, 7] s=Solution() print(s.maxArea(height))
LeetCode #14 三數之和
題目連接:https://leetcode-cn.com/problems/3sum/description/
代碼:
暴力解法
class Solution(object): def threeSum(self,nums): new_nums=[] for i in range(len(nums)): for j in range(i+1,len(nums)): for k in range(j+1,len(nums)): if nums[i]+nums[j]+nums[k] == 0:# 判斷三個元素相加是否爲0 if new_nums==[]: # 若是新數組內容爲空 new_nums.append([nums[i],nums[j],nums[k]]) #將目標值的索引append到新數組種 else: count = 0 for t in range(len(new_nums)):# 遍歷已有的結果數組 if not ((nums[i] in new_nums[t]) and (nums[j] in new_nums[t]) and (nums[k] in new_nums[t])): # 判斷循環值是否存在於子列表裏面 count+=1 # 若是存在+1 if count == len(new_nums): #判斷是否所有存在 new_nums.append([nums[i],nums[j],nums[k]]) return new_nums
結果很悲劇,開始只AC二十多組數據,後面修改以後AC了200組數據,一直沒有所有AC
後面在羣裏,各位大佬講解了二分法的思路
二分法
class Solution: def threeSum(self, nums): new_nums = [] # 建立新的數組儲存數據 nums.sort() # 對原有數組進行排序處理 for i in range(len(nums)-2): # 從小到大遍歷全部的元素 if i == 0 or nums[i] > nums[i-1]: # 去重處理以0分分界點避免重複 left = i+1 # 建立左指針 right = len(nums)-1 # 建立右指針 while left < right: ident = nums[left] + nums[right] + nums[i] #將nums[i]加上最大的 和 最小的 數字 ''' 判斷ident 若是爲0,append到新的數組種,並更新指針 並對指針進行判斷是否有重複值,若是有,就跳過 若是ident大於0,則想要的結果在左邊,更新左邊的指針 若是ident小於0,則想要的結果在右邊,更新右邊的指針 ''' if ident == 0: new_nums.append([nums[i], nums[left], nums[right]]) left += 1; right -= 1 while left < right and nums[left] == nums[left-1]: # skip duplicates left += 1 while left < right and nums[right] == nums[right+1]: right -= 1 elif ident < 0: left += 1 else: right -= 1 return new_nums nums=[-4,-2,1,-5,-4,-4,4,-2,0,4,0,-2,3,1,-5,0] new_nums=Solution.threeSum(0,nums) print(new_nums)