《剑指offer》那些思路清奇的题目

2023-11-09 21:59
文章标签 题目 offer 思路 清奇

本文主要是介绍《剑指offer》那些思路清奇的题目,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目:

  • 《剑指offer》OJ🔗
  • JZ70 矩形覆盖
  • JZ39 数组中出现次数超过一半的数字
  • JZ56 数组中只出现一次的两个数字
  • JZ68 二叉搜索树的最近公共祖先
  • JZ82 二叉树中和为某一值的路径(一)
  • JZ53 数字在升序数组中出现的次数
  • JZ38 字符串的排列

《剑指offer》OJ🔗

JZ70 矩形覆盖

当矩形长度为n时,矩形的覆盖情况可以是:
长度为n-1时的所有情况后边加一个竖着的矩形
长度为n-2时的所有情况后边加两个横着的矩形
所以与斐波那契数列类似。

class Solution {
public:int rectCover(int number) {if(number==0)return 0;int *num = new int[number+1];num[0]=1;num[1]=1;for(int i=2;i<=number;i++){num[i]=num[i-1]+num[i-2];}return num[number];}
};

JZ39 数组中出现次数超过一半的数字

摩尔投票法

诸侯争霸,假设你方人口超过总人口一半以上,并且能保证每个人口出去干仗都能一对一同归于尽。最后还有人活下来的国家就是胜利。

初始化:候选人cand , 候选人的投票次数count = 0
遍历数组,如果count = 0, 表示没有候选人,则选取当前数为候选人 count++
如果count>0, 表示有候选人,如果当前数=cand,count++,否则
–count

  int MoreThanHalfNum_Solution(vector<int> numbers) {int cand=0;int count = 0;for(int i=0;i<numbers.size();i++)if(count==0){cand=numbers[i];count++;}else{if(numbers[i]==cand)count++;elsecount--;}return cand;}
};

JZ56 数组中只出现一次的两个数字

思路:两个相同的值异或为0,则所有值异或的结果是要找的两个值的异或的结果,异或结果中某一位为1,则要找的两个值这一位不同,根据这一位为0还是1,把数据分为两组,两组分别全部异或起来,两个结果就是要找的值,注意返回值类型,注意逻辑运算和比较运算的优先级。

 vector<int> FindNumsAppearOnce(vector<int>& array) {int n=0;  //所有值异或的结果for(auto e:array){n^=e;}int m=n;  int i=0;while(1){if((m&1)==0){m=m>>1;i++;}elsebreak;}int n1=0,n2=0;for(auto e:array){if((e>>i&1)==0)n1^=e;elsen2^=e;}vector<int> a={n1,n2};if(n1>n2){a[0]=n2;a[1]=n1;} return a;}

JZ68 二叉搜索树的最近公共祖先

思路:

根节点作为当前节点开始,给定两值都比根节点小,两节点都在当前节点左子树,给定两值都比根节点大,两节点都在当前节点右子树,当前节点的值在给定值之间,当前节点就是解

int lowestCommonAncestor(TreeNode* root, int p, int q) {if(!root)return -1;if((p<=root->val&&q>=root->val)||(p>=root->val&&q<=root->val))return root->val;else if(p<root->val&&q<root->val)return lowestCommonAncestor(root->left,p,q);elsereturn lowestCommonAncestor(root->right,p,q);}

JZ82 二叉树中和为某一值的路径(一)

思路:递归,以根节点为当前节点,每次进入函数后sum减去当前节点的值,当当前节点为叶节点且sum为0,返回true

   bool hasPathSum(TreeNode* root, int sum) {if(!root)return false;sum-=root->val;if(root->left==nullptr&&root->right==nullptr&&sum==0)return true;return hasPathSum(root->left, sum)||hasPathSum(root->right, sum);}

因为找到一个解就满足,所以注意这里返回值的写法:

 return hasPathSum(root->left, sum)||hasPathSum(root->right, sum);

JZ53 数字在升序数组中出现的次数

思路一:二分搜索
细节:通过< 和<= 分别找到数字第一次出现的下标和数字最后一次出现的下个位置的下标
如果数字不存在,都指向第一个大于数字的下边

int GetNumberOfK(vector<int> data ,int k) {int l1=0,r1=data.size();while(l1<r1){int mid=l1+(r1-l1)/2;if(data[mid]<k)l1=mid+1;elser1=mid;}int l2=0,r2=data.size();   while(l2<r2){int mid=l2+(r2-l2)/2;if(data[mid]<=k)l2=mid+1;elser2=mid;}return r2-r1;}

思路二:使用库函数

  int GetNumberOfK(vector<int> nums ,int target) {return upper_bound(nums.begin(), nums.end(), target) - lower_bound(nums.begin(), nums.end(), target);}

在这里插入图片描述

返回一个迭代器,指向范围 [first,last) 中大于 val 的第一个元素

在这里插入图片描述

返回一个迭代器,该迭代器指向范围 [first,last) 中不小于 val的第一个元素

JZ38 字符串的排列

思路:全排列,去重后返回。

class Solution {
public:vector<string> s;void Perm(string list, int k, int m){if (k == m){string temp;for (int j = 0; j <= m; j++){temp.push_back(list[j]);}if(find(s.begin(),s.end(),temp)==s.end())s.push_back(temp);}elsefor(int i=k;i<=m;i++){   swap(list[k],list[i]);Perm(list,k+1,m);swap(list[k],list[i]);}
}vector<string> Permutation(string str) {if(str.empty())return s;Perm(str,0,str.size()-1);return s;}
};

这篇关于《剑指offer》那些思路清奇的题目的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/378682

相关文章

JAVA利用顺序表实现“杨辉三角”的思路及代码示例

《JAVA利用顺序表实现“杨辉三角”的思路及代码示例》杨辉三角形是中国古代数学的杰出研究成果之一,是我国北宋数学家贾宪于1050年首先发现并使用的,:本文主要介绍JAVA利用顺序表实现杨辉三角的思... 目录一:“杨辉三角”题目链接二:题解代码:三:题解思路:总结一:“杨辉三角”题目链接题目链接:点击这里

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

题目1254:N皇后问题

题目1254:N皇后问题 时间限制:1 秒 内存限制:128 兆 特殊判题:否 题目描述: N皇后问题,即在N*N的方格棋盘内放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在同一斜线上。因为皇后可以直走,横走和斜走如下图)。 你的任务是,对于给定的N,求出有多少种合法的放置方法。输出N皇后问题所有不同的摆放情况个数。 输入

题目1380:lucky number

题目1380:lucky number 时间限制:3 秒 内存限制:3 兆 特殊判题:否 提交:2839 解决:300 题目描述: 每个人有自己的lucky number,小A也一样。不过他的lucky number定义不一样。他认为一个序列中某些数出现的次数为n的话,都是他的lucky number。但是,现在这个序列很大,他无法快速找到所有lucky number。既然

三相直流无刷电机(BLDC)控制算法实现:BLDC有感启动算法思路分析

一枚从事路径规划算法、运动控制算法、BLDC/FOC电机控制算法、工控、物联网工程师,爱吃土豆。如有需要技术交流或者需要方案帮助、需求:以下为联系方式—V 方案1:通过霍尔传感器IO中断触发换相 1.1 整体执行思路 霍尔传感器U、V、W三相通过IO+EXIT中断的方式进行霍尔传感器数据的读取。将IO口配置为上升沿+下降沿中断触发的方式。当霍尔传感器信号发生发生信号的变化就会触发中断在中断

Jenkins 插件 地址证书报错问题解决思路

问题提示摘要: SunCertPathBuilderException: unable to find valid certification path to requested target...... 网上很多的解决方式是更新站点的地址,我这里修改了一个日本的地址(清华镜像也好),其实发现是解决不了上述的报错问题的,其实,最终拉去插件的时候,会提示证书的问题,几经周折找到了其中一遍博文

【408数据结构】散列 (哈希)知识点集合复习考点题目

苏泽  “弃工从研”的路上很孤独,于是我记下了些许笔记相伴,希望能够帮助到大家    知识点 1. 散列查找 散列查找是一种高效的查找方法,它通过散列函数将关键字映射到数组的一个位置,从而实现快速查找。这种方法的时间复杂度平均为(

码蹄集部分题目(2024OJ赛9.4-9.8;线段树+树状数组)

1🐋🐋配对最小值(王者;树状数组) 时间限制:1秒 占用内存:64M 🐟题目思路 MT3065 配对最小值_哔哩哔哩_bilibili 🐟代码 #include<bits/stdc++.h> using namespace std;const int N=1e5+7;int a[N],b[N],c[N],n,q;struct QUERY{int l,r,id;}que

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑燃料电池和电解槽虚拟惯量支撑的电力系统优化调度方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python

如何打造个性化大学生线上聊天交友系统?Java SpringBoot Vue教程,2025最新设计思路

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 | SpringBoot/SSM Python实战项目 | Django 微信小程序/安卓实战项目 大数据实战项目 ⚡⚡文末获取源码 文章目录