力扣题11~15

题11(中等):

思路:

这种题目第一眼就是双循环,但是肯定不行滴,o(n^2)这种肯定超时,很难接受。

所以要另辟蹊径,我们先用俩指针(标志位)在最左端和最右端,我们知道这个容器的最大容积是看最短的那条(木桶效应嘛)。如果我们让长的那一条再怎么大,都影响不了容积,所以我们加上底不变的话,要找最大容积,肯定要变短边嘛,动长边又改变不了什么,也就是说这个时候移动长边得到的一定不是。思路打开就写代码

python代码

class Solution:

def maxArea(self, height: List[int]) -> int:

left=0

right=len(height)-1

max_area=0

while left<right:

h=min(height[left],height[right])

w=right-left

area=h*w

max_area=max_area if max_area>area else area

if height[left]<height[right]:

left+=1

else:

right-=1

return max_area

题12(中等):

思路:

作为爬虫玩家,这种东西直接给个关系映射就好了啊,谁会去思考4,9特殊情况啊

python代码:

复制代码
class Solution:
    def intToRoman(self, num: int) -> str:
        Roman_str=''
        tran_json={
            1:'I',
            4:'IV',
            5:'V',
            9:'IX',
            10:'X',
            40:'XL',
            50:'L',
            90:'XC',
            100:'C',
            400:'CD',
            500:'D',
            900:'CM',
            1000:'M',
        }
        i=10
        while 1:
            if num<1:
                break
            #获得在各个位的数字
            h_num=num%10
            num=int(num/10)

            if h_num==0:
                i*=10
            elif h_num<4:
                Roman_str=h_num*tran_json[i/10]+Roman_str
                i*=10
            elif h_num==4:
                Roman_str=tran_json[4*i/10]+Roman_str
                i*=10
            elif h_num<9:
                Roman_str=tran_json[5*i/10]+(h_num-5)*tran_json[i/10]+Roman_str
                i*=10
            elif h_num==9:
                Roman_str=tran_json[9*i/10]+Roman_str
                i*=10
        return Roman_str

题13(简单):

思路:

和上面一样,不想那么多,直接用json存下换算规则,就像处理爬虫的字体加密一样,不想什么方法,直接字体识别出键值对来就套用,懒得看什么先转unicode啥的

python代码:

class Solution:

def romanToInt(self, s: str) -> int:

R_cout=0

tran_json={

'I':1,

'V':5,

'X':10,

'L':50,

'C':100,

'D':500,

'M':1000

}

ts_json={

'IV':4,

'IX':9,

'XL':40,

'XC':90,

'CD':400,

'CM':900

}

for key,value in ts_json.items():

s=s.replace(key,'|'+str(value))

for key,value in tran_json.items():

s=s.replace(key,'|'+str(value))

R_cout=sum(list(map(int,s.strip('|').split('|'))))

return R_cout

题14(简单):

思路:

双for循环直接解决了

python代码:

class Solution:

def longestCommonPrefix(self, strs: List[str]) -> str:

pub_str=''

for i in range(min([len(s) for s in strs])):

k=strs[0][i]

for j in range(1,len(strs)):

if k!=strs[j][i]:

return pub_str

pub_str+=k

return pub_str

题15(中等):

思路:

和前面一个容器的那个一样,用双指针法,我们将nums排好序,固定一个起始的话,如果大的话移动右指针,小的话移动左指针。

python代码:

class Solution:

def threeSum(self, nums: List[int]) -> List[List[int]]:

nums.sort()

result=[]

n_len=len(nums)

for i in range(len(nums)):

pos=i

if nums[i] > 0:

break

跳过可能重复的数字,避免重复的三元组

if i > 0 and nums[i] == nums[i-1]:

continue

left=pos+1

right=n_len-1

#预处理,如果前两个加最后一个都大的话,就删了最后一个

while left<right:

if nums[pos]+nums[left]+nums[right]>0:

right-=1

n_len-=1

else:

break

while left<right:

total = nums[i] + nums[left] + nums[right]

if total==0:

result.append([nums[pos],nums[left],nums[right]])

while left < right and nums[left] == nums[left + 1]:

left += 1

while left < right and nums[right] == nums[right - 1]:

right -= 1

left += 1

right -= 1

elif total>0:

right-=1

else:

left+=1

return result

相关推荐
编程绿豆侠2 小时前
力扣HOT100之二分查找: 34. 在排序数组中查找元素的第一个和最后一个位置
数据结构·算法·leetcode
Shan12052 小时前
找到每一个单词+模拟的思路和算法
数据结构·算法
国家不保护废物2 小时前
微信红包算法深度解析:从产品思维到代码实现
javascript·算法·面试
小明同学012 小时前
[C++入门]简化的艺术---对模版的初步探索
开发语言·c++·算法
kaiaaaa3 小时前
算法训练第八天
算法
LL_xjbt3 小时前
代码随想录刷题day29
算法·leetcode·动态规划
叶子2024223 小时前
守护进程实验——autoDL
人工智能·算法·机器学习
半桔4 小时前
【算法深练】分组循环:“分”出条理,化繁为简
数据结构·c++·算法·leetcode·面试·职场和发展
天天爱吃肉82184 小时前
【十年技术演进深度解构:车载充电机(OBC)将成为新能源汽车的“能源大脑”】
python·嵌入式硬件·算法·汽车·能源
KerwinChou_CN4 小时前
自由开发者计划 004:创建一个苹果手机长截屏小程序
图像处理·算法·智能手机·小程序