劍指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.pswp.cn/news/445398.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/445398.shtml
英文地址,請注明出處:http://en.pswp.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.基…