剑指offer(刷题61-65)--c++,Python版本

文章目录

  • 目录
    • 第61题:
      • 解题思路:
      • 代码实现:
        • c++
        • python
    • 第62题:
      • 解题思路:
      • 代码实现:
        • c++
        • python
    • 第63题:
      • 解题思路:
      • 代码实现:
        • c++
        • python
    • 第64题:
      • 解题思路:
      • 代码实现:
        • c++
        • python
    • 第65题:
      • 解题思路:
      • 代码实现:
        • c++
          • 回溯法
          • 动态规划法
        • python

目录

第61题:

给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。

解题思路:

  • 由于是二叉搜索树,其节点存放的值是有一定的规律的,所以我们可以使用一个数组存放二叉搜索树的中序遍历结果,然后直接将数字的第K个结果给出即可。时间复杂度为O(N),空间复杂度也为O(N)。

代码实现:

c++

class Solution {
public:int index = 0;TreeNode* KthNode(TreeNode* pRoot, int k){if(pRoot != NULL){TreeNode* node = KthNode(pRoot->left , k);if(node != NULL) return node;index ++;if(index == k) return pRoot;node = KthNode(pRoot->right , k);if(node != NULL) return node;}return NULL;} 
};

运行时间:4ms

占用内存:608k

class Solution {
public:TreeNode* KthNode(TreeNode* pRoot, unsigned int k){if(pRoot==NULL||k<=0) return NULL;vector<TreeNode*> vec;Inorder(pRoot,vec);if(k>vec.size())return NULL;return vec[k-1];}//中序遍历,将节点依次压入vector中void Inorder(TreeNode* pRoot,vector<TreeNode*>& vec){if(pRoot==NULL) return;Inorder(pRoot->left,vec);vec.push_back(pRoot);Inorder(pRoot->right,vec);} 
};

python

# -*- coding:utf-8 -*-

第62题:

如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。

解题思路:

/**
* 插入有两种思路:
* 1:直接插入大堆中,之后若两堆尺寸之差大于1(也就是2),则从大堆中弹出堆顶元素并插入到小堆中
* 若两队之差不大于1,则直接插入大堆中即可。
* 2:奇数个数插入到大堆中,偶数个数插入到小堆中,
* 但是 可能会出现当前待插入的数比小堆堆顶元素大,此时需要将元素先插入到小堆,然后将小堆堆顶元素弹出并插入到大堆中
* 对于偶数时插入小堆的情况,一样的道理。why?
* 因为要保证最大堆的元素要比最小堆的元素都要小。
* @param num
*/

代码实现:

c++

class Solution {
public:priority_queue<int, vector<int>, less<int> > p;  //小堆priority_queue<int, vector<int>, greater<int> > q; //大堆void Insert(int num){if(p.empty() || num <= p.top()) p.push(num);else q.push(num);if(p.size() == q.size() + 2) q.push(p.top()), p.pop();if(p.size() + 1 == q.size()) p.push(q.top()), q.pop();}double GetMedian(){ return p.size() == q.size() ? (p.top() + q.top()) / 2.0 : p.top();}};

运行时间:6ms

占用内存:484k

python

# -*- coding:utf-8 -*-

第63题:

给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。

解题思路:

  • 暴力解法:直接使用滑动窗的原理,得出每个窗口的数据,然后给出最大值即可。时间复杂度为O(N^2).

代码实现:

c++


python

# -*- coding:utf-8 -*-
class Solution:def maxInWindows(self, num, size):# write code hereresList = []sampleNum = (len(num)-size + 1)if sampleNum <= 0 or size <=0:return resListfor i in range(sampleNum):resList.append(max(num[i:i+size]))return resList

运行时间:31ms

占用内存:5728k

第64题:

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。

解题思路:

代码实现:

c++

class Solution {bool hasPathRecu(char* matrix, int rows, int cols, int row, int col, char *str, int length, vector<bool> used){if(length==strlen(str))return true;if(row<0||row>=rows||col<0||col>=cols)return false;int index = col + row*cols;bool result = false;if( !used[index] && matrix[index]==str[length]){used[index] = true;result = hasPathRecu(matrix, rows, cols, row-1, col, str, length+1, used)|| hasPathRecu(matrix, rows, cols, row+1, col, str, length+1, used)||hasPathRecu(matrix, rows, cols, row, col+1, str, length+1, used)||hasPathRecu(matrix, rows, cols, row, col-1, str, length+1, used);used[index] = false;}if(result)return true;return false;}
public:bool hasPath(char* matrix, int rows, int cols, char* str){vector<bool> used(strlen(matrix),false);if(str==NULL) return true;for(int i=0;i<rows;i++){for(int j=0;j<cols;j++){if(hasPathRecu(matrix, rows, cols, i, j, str, 0, used))return true;}}return false;}
};

运行时间:5ms

占用内存:364k

python

# -*- coding:utf-8 -*-

第65题:

地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?

解题思路:

代码实现:

c++

回溯法
class Solution {bool hasPathRecu(char* matrix, int rows, int cols, int row, int col, char *str, int length, vector<bool> used){if(length==strlen(str))return true;if(row<0||row>=rows||col<0||col>=cols)return false;int index = col + row*cols;bool result = false;if( !used[index] && matrix[index]==str[length]){used[index] = true;result = hasPathRecu(matrix, rows, cols, row-1, col, str, length+1, used)|| hasPathRecu(matrix, rows, cols, row+1, col, str, length+1, used)||hasPathRecu(matrix, rows, cols, row, col+1, str, length+1, used)||hasPathRecu(matrix, rows, cols, row, col-1, str, length+1, used);used[index] = false;}if(result)return true;return false;}
public:bool hasPath(char* matrix, int rows, int cols, char* str){vector<bool> used(strlen(matrix),false);if(str==NULL) return true;for(int i=0;i<rows;i++){for(int j=0;j<cols;j++){if(hasPathRecu(matrix, rows, cols, i, j, str, 0, used))return true;}}return false;}
};

运行时间:3ms

占用内存:476k

动态规划法
public class Solution {public int movingCount(int threshold, int rows, int cols){if(threshold<0)return 0;boolean [][] dp=new boolean[rows+1][cols+1];dp[0][0]=true;for(int i=1;i<=rows;i++){//初始化if(dp[i-1][0]&&canreach(threshold,i,0)){dp[i][0]=true;}else {dp[i][0]=false;}}for(int i=1;i<=cols;i++){//初始化if(dp[0][i-1]&&canreach(threshold,0,i)){dp[0][i]=true;}else {dp[0][i]=false;}}for(int i=1;i<=rows;i++){for(int j=1;j<=cols;j++){if((dp[i-1][j]&&canreach(threshold, i, j))||(dp[i][j-1]&&canreach(threshold, i, j))){dp[i][j]=true;}else {dp[i][j]=false;}}}int count=0;for(int i=0;i<rows;i++){for(int j=0;j<cols;j++){if(dp[i][j])count++;}}      return count;      }public  boolean canreach(int threshold, int x, int y) {int sum = 0;while (x > 0) {sum += x % 10;x /= 10;}while (y > 0) {sum += y % 10;y /= 10;}return sum <= threshold;}
}

python

# -*- coding:utf-8 -*-

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/445398.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2018第二届河北省大学生程序设计竞赛题解

icebound的账单 题目描述 icebound从小就有记账的习惯。又到了月末icebound统计资金状况的时候。icebound每个月除了不停的挥霍以外&#xff0c;有时他会良心发现&#xff0c;勤工俭学&#xff0c;因此会有一些微薄的收入。然而icebound数学不好&#xff0c;需要你来帮助他统计…

大数的四则运算(加法、减法、乘法、除法)

大数的四则运算&#xff08;加法、减法、乘法、除法&#xff09; 前言&#xff1a; 在计算机中数字表示的范围是有限制的&#xff0c;比如我们熟知的 int、float、double 等数据类型所能表示的范围都是有限的&#xff0c;如果我们要对位数达到几十位、几百位、上千位的大整数进…

数组基操三连(1)

题目&#xff1a; 给定一个数组arr&#xff0c;求出需要排序的最短子数组长度 要求&#xff1a; 时间o(n),空间o(1) 思路&#xff1a; 有序的数组中&#xff0c;任意一个数字&#xff0c;一定小于左边的数大于右边的数。 我们找到的需要排序的子数组&#xff0c;显然是比右边…

IT互联网公司的笔试的输入输出- c++ python

文章目录目录c方式1&#xff1a;方式2&#xff1a;Python方式1&#xff1a;方式2&#xff1a;方式3&#xff1a;目录 c 方式1&#xff1a; 第一种情况&#xff1a;输入n个数&#xff0c;存放在数组中 #include <iostream> #include <vector> using namespace st…

随机过程1

随机过程1概述1.参考书目2.主要内容3.概率论--基本概念回顾3.1对“不确定性”的认识3.2 应对“不确定性”应该怎么做3.3随机变量&#xff08;Random Variable&#xff09;3.4分布函数&#xff08;Distribution Function&#xff09;3.5概率密度&#xff08;Density&#xff09;…

数组基操三连(4)

题目一 给定一个长度为N的整型数组arr&#xff0c;其中有N个互不相等的自然数1~N 请实现arr的排序 但是不要把下标0~N-1位置上的数值通过直接赋值的方式替换成1~N。 要求&#xff1a;时间复杂度为O(N)&#xff0c;额外空间复杂度为O(1)。 思路&#xff1a;从左向右检查&…

Linux(1)-touch,mkdir,rm,mv,cp,ls,cd,cat

Linux1-实用终端命令1. touch, mkdir2. rm, mv, cp3. ls(通配符),cd(绝对/相对路径)4. cat, more/less文件内容浏览文件/目录-增删查改, 文件内容查看.1. touch, mkdir touch新文件 &#xff1a;在当前文件夹下&#xff0c;创建文件。文件不存在则创建新文件&#xff1b;文件存…

java常用类介绍及源码阅读(ArrayList)

java.util 类 ArrayList<E> 继承关系&#xff1a; java.lang.Objectjava.util.AbstractCollection<E>java.util.AbstractList<E>java.util.ArrayList<E>List 接口的动态数组的实现。 实现了所有可选列表操作&#xff0c;并允许包括 null 在内的所有…

tests1

ls,cd,tardone

数组精选题目三连(5)

子数组的最大累加和问题 输入一个整形数组&#xff0c;求数组中连续的子数组使其和最大。比如&#xff0c;数组x 应该返回 x[2..6]的和187. 这四个代码完成的功能都是求最大子数组&#xff08;注意用词准确&#xff0c;子数组连续&#xff0c;子序列可以不连续&#xff09;。…

大数据学习(1)-大数据概述

文章目录目录大数据产生背景大数据概念大数据影响大数据应用大数据关键技术大数据产业大数据&#xff0c;云计算&#xff0c;物联网关系云计算物联网大数据&#xff0c;物联网&#xff0c;云计算三者之间联系目录 大数据产生背景 三次信息化浪潮 根据IBM前首席执行官郭士纳福…

java常用类介绍及源码阅读(LinkedList)

java.util 类 LinkedList<E> java.lang.Objectjava.util.AbstractCollection<E>java.util.AbstractList<E>java.util.AbstractSequentialList<E>java.util.LinkedList<E> List 接口的链接列表实现。实现所有可选的列表操作&#xff0c;并且允…

矩阵论-集合与映射,线性空间及其性质

线性空间与线性变换综述1.1 线性空间1.1.1 集合与映射1.1.2 线性空间及其性质综述 本系列博文主要总结学习矩阵论的心得笔记&#xff0c;参考数目《矩阵论》–张凯院&#xff1b;整个文章的整理体系参照行书过程。 1.1 线性空间 1.1.1 集合与映射 1.集合&#xff1a;将很多…

机器学习知识总结系列-机器学习中的数学-概率与数理统计(1-3-1)

文章目录目录1.概率与统计1.1 机器学习与概率统计之间的关系1.2 重要的统计量1.2.1 期望1.2.2 方差1.2.3 协方差&#xff0c;相关系数协方差相关系数1.2.4 矩1.3 重要的定理与不等式1.4 用样本估计参数目录 1.概率与统计 1.1 机器学习与概率统计之间的关系 1.什么是概率问题…

redis——事件

redis服务器是一个事件驱动程序。 需要处理两类事件&#xff1a; 1&#xff09;文件事件&#xff1a;redis是通过套接字与客户端或者其他服务器连接的&#xff0c;而文件事件就是服务器对套接字操作的抽象。 2&#xff09;时间事件&#xff1a;服务器对一些定时操作的抽象。…

自然语言处理(1)-概述

自然语言处理-概述概述1.基本概念2.人类语言技术HLT发展简史3.HLT 研究内容4.基本问题和主要困难5.基本研究方法概述 本系列文章计划总结整理中国科学院大学宗成庆老师《自然语言处理》课程相关知识&#xff0c;参考数目《统计自然语言处理》-第二版&#xff0c;宗成庆。 1.基…