leetcode学习笔记(3)——查找1

一、Task03:查找1

1.1 独立完成以下leetcode题目:

35. 搜索插入位置

202. 快乐数

205. 同构字符串

242. 有效的字母异位词

290. 单词规律

349. 两个数组的交集

350. 两个数组的交集 II

410. 分割数组的最大值

451. 根据字符出现频率排序

540. 有序数组中的单一元素

二、代码

2.1代码——搜索插入位置

class Solution:
    def searchInsert(self, nums: List[int], target: int) -> int:
        for i in range(len(nums)):
            if target > nums[len(nums)-1]:
                return len(nums)
            elif target < nums[i] or target == nums[i]:
                return i
            elif nums[i] < target and target < nums[i+1]:
                return i+1 

在这里插入图片描述

2.2代码——快乐数

class Solution:
    def isHappy(self, n: int) -> bool:
        not_happly_num_set = {0,1,4,16,37,58,89,145,42,20}
        while not (n in not_happly_num_set):
            res = 0
            while n:
                div,mod = divmod(n,10)
                res += pow(mod,2)
                n = div
            n = res
        return 1  if n==1  else 0

在这里插入图片描述

2.3代码——同构字符串

class Solution:
    def isIsomorphic(self, s: str, t: str) -> bool:
        dct = {}
        for i in range(len(s)):
            if s[i] not in dct:
                if t[i] in dct.values():
                    return False
                dct[s[i]] = t[i]
            else:
                if dct[s[i]] != t[i]:
                    return False
        return True

在这里插入图片描述

2.4代码——有效的字母异位词

class Solution(object):
    def isAnagram(self, s, t):
    	if sorted(s) == sorted(t):
    		return True
    	else:
    		return False


在这里插入图片描述

2.5代码——单词规律

class Solution:
    def wordPattern(self, pattern: str, str: str) -> bool:
        t = str.split()
        if len(pattern) != len(t):
            return False
        dct = {}
        for i in range(len(pattern)):
            if pattern[i] not in dct:
                if t[i] in dct.values():
                    return False
                dct[pattern[i]] = t[i]
            else:
                if dct[pattern[i]] != t[i]:
                    return False
        return True

在这里插入图片描述

2.6代码——两个数组的交集

class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        array = []
        for m in nums1:
            if m in nums2 and m not in array:
                array.append(m)
        return array

在这里插入图片描述

2.7代码——两个数组的交集 II

class Solution:
    def intersect(self, nums1: [int], nums2: [int]) -> [int]:
        nums1.sort()
        nums2.sort()
        r = []
        left, right = 0, 0
        while left < len(nums1) and right < len(nums2):
            if nums1[left] < nums2[right]:
                left += 1
            elif nums1[left] == nums2[right]:
                r.append(nums1[left])
                left += 1
                right += 1    
            else:
                right += 1
        return r

```![在这里插入图片描述](https://img-blog.csdnimg.cn/20200825113757374.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NTU1ODQx,size_16,color_FFFFFF,t_70#pic_center)


## 2.8代码——分割数组的最大值

```python
class Solution:
    def splitArray(self, nums: List[int], m: int) -> int:
        left, right = max(nums),sum(nums)
        while left < right:
            mid = (left + right) // 2
            sums, cnt = 0, 1
            for i in nums:
                if sums + i > mid:
                    cnt += 1
                    sums = i
                else:
                    sums += i
            if cnt <= m:
                right = mid
            else:
                left = mid + 1
        return left

在这里插入图片描述

2.9代码——根据字符出现频率排序

class Solution:
    def frequencySort(self, s: str) -> str:
        return ''.join([i * j for i, j in collections.Counter(s).most_common()])

``![在这里插入图片描述](https://img-blog.csdnimg.cn/20200825114103664.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NTU1ODQx,size_16,color_FFFFFF,t_70#pic_center)
`

## 2.10代码——有序数组中的单一元素

```python
class Solution:
    def singleNonDuplicate(self, nums: List[int]) -> int:
        left = 0
        right = len(nums)-1

        while left<right:
            mid = (left+right)//2
            if (mid == 0 or nums[mid] != nums[mid-1]) and nums[mid] != nums[mid+1]:
                return nums[mid]
            elif nums[mid] == nums[mid+1]:
                if (mid-left)%2 == 0:
                    left = mid
                else:
                    right = mid-1
            else:
                if (mid-left+1)%2 == 0:
                    left = mid+1
                else:
                    right = mid
        return nums[left]

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值