算法——查找排序相关面试题和leetcode使用

1、给两个字符串s和t,判断t是否为s的重新排列后组成的单词。

  • s = "anagram", t = "nagaram", return true.
  • s = "rat", t = "car", return false.
  • leetcode地址:https://leetcode.com/problems/valid-anagram/description/

(1)解法一:排序,O(n*logn)

class Solution:
    def isAnagram(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: bool
        """
        ss = list(s)
        tt = list(t)
        ss.sort()
        tt.sort()
        return ss == tt
"""
输入:"anagram"、"nagaram"
输出:true
Runtime: 32 ms
"""

  排序方法简写如下:

class Solution:
    def isAnagram(self, s, t):
        return sorted(list(s)) == sorted(list(t))

(2)解法二:判断字母数量一致,时间复杂度O(n)

class Solution:
    def isAnagram(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: bool
        """
        dict1 = {}   # 用字典来维护字符的数量
        dict2 = {}
        for ch in s:
            dict1[ch] = dict1.get(ch, 0) + 1   # 没有就新建,有就加1
        for ch in t:
            dict2[ch] = dict2.get(ch, 0) + 1
        return dict1 == dict2

"""
输入:"anagram","nagaram"
输出:true
Runtime: 32 ms
"""

2、给定一个m*n的二维列表,查找一个数是否存在。

  列表有下列特性:

  • 每一行的列表从左到右已经排序好。
  • 每一行第一个数比上一行最后一个数大。
  • leetcode地址:https://leetcode.com/problems/search-a-2d-matrix/description/

  

(1)解法一:线性查找查找,O(mn)

class Solution:
    def searchMatrix(self, matrix, target):
        """
        :type matrix: List[List[int]]
        :type target: int
        :rtype: bool
        """
        for line in matrix:
            if target in line:
                return True
        return False

(2)解法二:二分查找O(logn)

class Solution:
    def searchMatrix(self, matrix, target):
        """
        :type matrix: List[List[int]]
        :type target: int
        :rtype: bool
        """
        h = len(matrix)  # 高
        if h == 0:
            return False

        w = len(matrix[0])  # 列
        if w == 0:
            return False

        left = 0
        right = w * h - 1

        while left  <= right:
            mid = ((left + right)) // 2
            i = mid // w
            j = mid % w
            if matrix[i][j] == target:
                return True
            elif matrix[i][j] > target:
                right = mid - 1
            else:
                left = mid + 1
        else:
            return False

3、给定一个列表和一个整数,设计算法找到两个数的下标,使得两个数之和为给定的整数。

  保证肯定仅有一个结果。

  leetcode地址:https://leetcode.com/problems/two-sum-ii-input-array-is-sorted/description/

  例如,列表[1,2,5,4]与目标整数3,1+2=3,结果为(0,1).

(1)方法一:通过二分查找,找到需要的数字。时间复杂度:O(nlogn)

  首先确定第一个数,再通过给定整数确定要查找的数,通过二分查找到需要的数。

class Solution:
    def binary_search(self, li, left, right,val):
        """
        二分查找
        :param li: 输入的列表
        :param val: 输入的待查找的值
        :return:
        """
        while left <= right:  # 说明候选区有值
            mid = (left + right) // 2   # 因为是下标, 因此要整除2
            if li[mid] == val:
                # 找到待查找的值返回index
                return mid
            elif li[mid] > val:
                # 待查找的值在mid左侧
                right = mid - 1   # 更新候选区
            else:  # li[mid] < val
                # 待查找的值在mid右侧
                left = mid + 1    # 更新候选区
        else:
            # 没有找到
            return None

    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        for i in range(len(nums)):
            a = nums[i]
            b = target - a
            if b >= a:
                j = self.binary_search(nums, i+1, len(nums)-1, b)
            else:
                j = self.binary_search(nums, 0, i-1, b)
            if j:
                break
        return sorted([i+1,j+1])

(2)方法二:针对已经排好序的列表

  leetcode地址:https://leetcode.com/problems/two-sum/description/

class Solution:
    def binary_search(self, li, left, right,val):
        """
        二分查找
        :param li: 输入的列表
        :param val: 输入的待查找的值
        :return:
        """
        while left <= right:  # 说明候选区有值
            mid = (left + right) // 2   # 因为是下标, 因此要整除2
            if li[mid][0] == val:
                # 找到待查找的值返回index
                return mid
            elif li[mid][0] > val:
                # 待查找的值在mid左侧
                right = mid - 1   # 更新候选区
            else:  # li[mid] < val
                # 待查找的值在mid右侧
                left = mid + 1    # 更新候选区
        else:
            # 没有找到
            return None

    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        new_nums = [[num, i] for i,num in enumerate(nums)]
        new_nums.sort(key=lambda x:x[0])

        for i in range(len(new_nums)):
            a = new_nums[i][0]   # 数
            b = target - a
            if b >= a:
                j = self.binary_search(new_nums, i+1, len(new_nums)-1, b)
            else:
                j = self.binary_search(new_nums, 0, i-1, b)
            if j:
                break
        return sorted([new_nums[i][1], new_nums[j][1]])

原文地址:https://www.cnblogs.com/xiugeng/p/9745743.html

时间: 2024-10-18 06:06:26

算法——查找排序相关面试题和leetcode使用的相关文章

查找排序相关面试题

原文地址:https://www.cnblogs.com/foremostxl/p/10252959.html

二分查找的相关算法题

最近笔试经常遇到二分查找的相关算法题 1)旋转数组中的最小数字 2)在旋转数组中查找某个数 2)排序数组中某个数的出现次数 下面我来一一总结 1 旋转数组的最小数字 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. 实现数组的旋转见左旋转字符串. 和二分查找法一样,用两个指针分别指向数组的第一个元素和最后一个元素. 我们注意到旋转

前端排序算法总结;前端面试题2.0;JavaScript异步编程

1.前端 排序算法总结 排序算法可能是你学编程第一个学习的算法,还记得冒泡吗? 当然,排序和查找两类算法是面试的热门选项.如果你是一个会写快排的程序猿,面试官在比较你和一个连快排都不会写的人的时候,会优先选择你的.那么,前端需要会排序吗?答案是毋庸置疑的,必须会.现在的前端对计算机基础要求越来越高了,如果连排序这些算法都不会,那么发展前景就有限了.本篇将会总结一下,在前端的一些排序算法. https://segmentfault.com/a/11... 2.前端面试题 V2.0 详见: 这是一份

C++提高5 STL算法 :查找,统计,排序,拷贝,替换,算术,集合 |STL 案例:学校演讲比赛介绍

[本文谢绝转载] <大纲> STL 算法 查找算法 adjacent_find()查找容器中重复元素的首地址 distance()根据迭代器,返回元素的下标 binary_search()二分查找:在有序的序列 find   查找函数 find_if 自定义查找函数 统计算法 count 返回容器中相同元素的个数 cout_if 统计大于3的元素个数 排序算法 marge()对两个有序容器组合到另一个容器 sort 自定义排序 random_shuffle 随机洗牌 基本数据类型 random

常用查找排序算法

1.折半查找算法: 对于一个已排好序的数组,若要查找某元素是否属于数组中,则可以用这种算法. 返回找到的元素在数组中的下标,找不到则返回-1 #include <stdio.h> #define LEN 8 int a[LEN] = { 1, 3, 3, 3, 4, 5, 6, 7 }; int binarysearch(int number) { int mid, start = 0, end = LEN - 1; while (start <= end) { mid = (start

查找和排序的基本操作:查找排序算法大集合

重点 查找算法着重掌握:顺序查找.二分查找.哈希表查找.二叉排序树查找. 排序算法着重掌握:冒泡排序.插入排序.归并排序.快速排序. 顺序查找 算法说明 顺序查找适合于存储结构为顺序存储或链接存储的线性表. 算法思想 顺序查找也称为线形查找,属于无序查找算法.从数据结构线形表的一端开始,顺序扫描,依次将扫描到的结点关键字与给定值k相比较,若相等则表示查找成功:若扫描结束仍没有找到关键字等于k的结点,表示查找失败. 算法实现 int sequenceSearch(int a[], int valu

【经典算法——查找】二分查找

二分查找又称为折半查找,仅适用于事先已经排好序的顺序表.其查找的基本思路:首先将给定值K,与表中中间位置元素的关键字比较,若相等,返回该元素的存储位置:若不等,这所需查找的元素只能在中间数据以外的前半部分或后半部分中.然后在缩小的范围中继续进行同样的查找.如此反复直到找到为止.算法如下: 1 template<typename T> 2 int BinarySearch(vector<T> &data, T key) { 3 int low = 0, high = data

Java集合类相关面试题

1.Collection和Collections的区别 java.util.Collection 是一个集合接口,Collection接口在Java类库中有很多具体的实现,例如List.Set java.util.Collections 是针对集合类的一个帮助类,它提供了一系列的静态方法实现对各种集合的搜索.排序.线程安全化等操作. 2.ArrayList与Vector的区别 这两个类都实现了List接口(List接口继承自Collection接口).它们都是有序集合,它们内部的元素都是可以重复

图解精选 TOP 面试题 002 | LeetCode 104. 二叉树的最大深度

该系列题目取自 LeetCode 精选 TOP 面试题列表:https://leetcode-cn.com/problemset/top/ 题目描述 原题链接:https://leetcode-cn.com/problems/maximum-depth-of-binary-tree 给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明:叶子节点是指没有子节点的节点. 示例: 给定二叉树 [3,9,20,null,null,15,7], 3 / 9 20