717. 1比特与2比特字符 / 18. 四数之和 / 22. 括号生成

2023-11-01 05:40

本文主要是介绍717. 1比特与2比特字符 / 18. 四数之和 / 22. 括号生成,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

717. 1比特与2比特字符【简单题】【每日一题】

思路:

  1. 从前往后遍历bits数组,如果当前元素是1,那么由于第二种字符无论是10还是11,都是以1开头,所以可以肯定当前元素和它的下一个元素构成第二种字符,直接 i+= 2;bits数组只有0和1,不是1的话那必然是0,而只有第一种字符以0开头,且只占一位,所以此时如果当前元素已经是最后一位了,那么此时最后一位可以构成第一种字符,于是直接返回true,如果不是最后一位,那么i++。
  2. 如果可以跳出for循环,说明此时最后一位无法构成字符,于是返回false。

代码:

class Solution {public boolean isOneBitCharacter(int[] bits) {int len = bits.length,i = 0;while (i<len){if (bits[i] == 1){i+=2;}else {if (i == len-1){return true;}else {i++;}}}return false;}
}

用时:

在这里插入图片描述


18. 四数之和【中等题】

思路:

  1. 与三数之和类似,本题的四数之和先固定第一个数,再固定第二个数,然后双指针表示后两个数,实现思路就是,先排序,数组自左向右依次变大,于是,当前两个数固定之后,后两个数与前两个数这四数之和如果大于target,则右指针左移,如果小于target,则左指针右移,如果等于target,则说明这四个数就是我们要找的四个数,将其添加到ans列表中,同时题目中要求四元组不能相同,因此可以用hashset对其进行去重,做法是,将ans定义为hashset格式,然后返回new
    ArrayList(ans)。
  2. 这个题重点不在解题思路,在如何剪枝,按照如上思路写出来的,用时 116ms,击败5%,我一看时间不对啊,这也太长了,我就去看题解,结果发现题解也是这个思路,但是它剪枝了,我就想,那我也去剪剪试试,此时还没看题解代码。
  3. 第一次修改,增加了固定第一个数之后,如果前四个数大于target,则直接退出第一层for循环;如果前四个数等于target,则将这四个数添加到答案ans中,并继续下一次第一层for循环;如果第一个数和后三个数之和小于target,则继续下一次第一层for循环。增加了固定第二个数之后,如果前两个数与接下来数组中前两个数之和大于target,则直接退出第二层for循环;如果前两个数与接下来数组中后两个数之和小于target,则继续下一次第二层for循环。修改之后用时
    18ms ,还是没追上题解。
  4. 第二次修改,在第一次修改的基础上,增加了在第一层for循环的开始,先判断当i大于0时,当前i位置数与前一个位置数是否相等,如果相等,说明四元组中第一个数重复了,而当后3个数不变的情况下,如果第一个数重复必然会导致整个四元组的重复,因此跳过这个重复的数字,即继续下一次第一层for循环;同理在第二层for循环的开始,先判断当j>i+1时,当前j位置数是否与前一个位置数相等,如果相等,则跳过这个重复的数字,继续下一次第二层for循环。修改之后用时
    5ms ,还是没追上题解。
  5. 第三次修改,在第一次和第二次修改的基础上,增加了:对第三个和第四个数的去重,即在while循环中,如果遇到符合题意的四元组,则将其添加到ans中的同时,可以同时使用while循环对left和right位置的数进行去重,如果left位置和left+1位置的数相等,那么left++,如果right位置和right-1位置的数相等,那么right–;同时发现当四个数都进行去重之后,我就不用去hashset对四元组进行去重了,我现在的ans已经没有重复的四元组了,于是将ans修改为ArrayList形式的列表,最后返回ans;另外,在开头添加判断条件,当nums数组的长度小于4时,不可能有符合条件的四元组,此时直接返回空的ans。修改之后用时
    3ms ,还是没有追上题解。
  6. 第四次修改,其实第3次修改就是看了题解的代码改的,结果发现还是比它差了1ms,经过我又一次的观察,发现题解添加四个数字进list的方式不一样,
    题解用的是,ans.add(Arrays.asList(nums[i],nums[j],nums[left],nums[right]));
    而我用的是
    ans.add(new ArrayList(Arrays.asList(nums[i],nums[j],nums[left],nums[right])));
    就事实来说,题解的肯定更好一点,是我太菜了我不知道还可以这么写。

代码:
直接放第4版的代码了。

class Solution {public List<List<Integer>> fourSum(int[] nums, int target) {List<List<Integer>> ans = new ArrayList<>();int len = nums.length;if (len<4){return ans;}Arrays.sort(nums);for (int i = 0; i < len-3; i++) {if(i > 0 && nums[i] == nums[i-1]){continue;}long before4_1 = (long) nums[i]+nums[i+1]+nums[i+2]+nums[i+3];if (before4_1 > target){break;}else if (before4_1 == target){ans.add(Arrays.asList(nums[i],nums[i+1],nums[i+2],nums[i+3]));continue;}if ((long)nums[i]+nums[len-1]+nums[len-2]+nums[len-3] < target){continue;}for (int j = i+1; j < len-2; j++) {if(j > i+1 && nums[j] == nums[j-1]){continue;}int left = j+1,right = len-1;long pre = (long) nums[i]+nums[j],before4_2 = pre + nums[left]+nums[left+1];if (before4_2 > target){break;}if (pre +nums[right]+nums[right-1] < target){continue;}while (left<right){int cur = nums[left]+nums[right];if (pre+cur<target){left++;}else if (pre+cur>target){right--;}else {ans.add(Arrays.asList(nums[i],nums[j],nums[left],nums[right]));while (left < right && nums[left] == nums[left + 1]) {left++;}left++;while (left < right && nums[right] == nums[right - 1]) {right--;}right--;}}}}return ans;}
}

用时:

在这里插入图片描述


22. 括号生成【中等题】

思路:

  1. 我不知道这算动态规划还是算递归,但感觉跟青蛙跳台阶的题有相似之处。
  2. 定义hashset类型ans用来存储去重的答案,初值默认为一对儿括号。从2开始for循环遍历,到n结束(可以取到n),定义一个hashset类型temp来存储括号对数为i时可以生成的括号;遍历ans中的每一个括号组合,设遍历到的括号组合为str,那么依次在str的每一个元素后边插入一对括号(可以在整个str的前方插入括号,也可以在整个str的后方插入括号);将插入括号的新括号组合存入temp中;当ans中所有的括号组合都被遍历过之后,将ans更新为temp中的所有括号组合,并继续下一次关于
    i 的for循环。
  3. 当遍历完n之后,for循环退出,此时将ans转为ArrayList类型列表返回。
  4. 主要解题依据是,根据上一个n的括号组合,来求当前n的括号组合。

代码:

class Solution {public List<String> generateParenthesis(int n) {Set<String> ans = new HashSet<>();ans.add("()");for (int i = 2; i <= n; i++) {Set<String> temp = new HashSet<>();for (String str : ans){for (int j = 0; j < str.length(); j++) {temp.add(str.substring(0,j)+"()"+str.substring(j));}}ans = temp;}return new ArrayList<>(ans);}
}

用时:

在这里插入图片描述

这篇关于717. 1比特与2比特字符 / 18. 四数之和 / 22. 括号生成的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

AI一键生成 PPT

AI一键生成 PPT 操作步骤 作为一名打工人,是不是经常需要制作各种PPT来分享我的生活和想法。但是,你们知道,有时候灵感来了,时间却不够用了!😩直到我发现了Kimi AI——一个能够自动生成PPT的神奇助手!🌟 什么是Kimi? 一款月之暗面科技有限公司开发的AI办公工具,帮助用户快速生成高质量的演示文稿。 无论你是职场人士、学生还是教师,Kimi都能够为你的办公文

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

poj 1287 Networking(prim or kruscal最小生成树)

题意给你点与点间距离,求最小生成树。 注意点是,两点之间可能有不同的路,输入的时候选择最小的,和之前有道最短路WA的题目类似。 prim代码: #include<stdio.h>const int MaxN = 51;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int P;int prim(){bool vis[MaxN];

poj 2349 Arctic Network uva 10369(prim or kruscal最小生成树)

题目很麻烦,因为不熟悉最小生成树的算法调试了好久。 感觉网上的题目解释都没说得很清楚,不适合新手。自己写一个。 题意:给你点的坐标,然后两点间可以有两种方式来通信:第一种是卫星通信,第二种是无线电通信。 卫星通信:任何两个有卫星频道的点间都可以直接建立连接,与点间的距离无关; 无线电通信:两个点之间的距离不能超过D,无线电收发器的功率越大,D越大,越昂贵。 计算无线电收发器D

hdu 1102 uva 10397(最小生成树prim)

hdu 1102: 题意: 给一个邻接矩阵,给一些村庄间已经修的路,问最小生成树。 解析: 把已经修的路的权值改为0,套个prim()。 注意prim 最外层循坏为n-1。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstri

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

poj 3723 kruscal,反边取最大生成树。

题意: 需要征募女兵N人,男兵M人。 每征募一个人需要花费10000美元,但是如果已经招募的人中有一些关系亲密的人,那么可以少花一些钱。 给出若干的男女之间的1~9999之间的亲密关系度,征募某个人的费用是10000 - (已经征募的人中和自己的亲密度的最大值)。 要求通过适当的招募顺序使得征募所有人的费用最小。 解析: 先设想无向图,在征募某个人a时,如果使用了a和b之间的关系

Thymeleaf:生成静态文件及异常处理java.lang.NoClassDefFoundError: ognl/PropertyAccessor

我们需要引入包: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>sp

string字符会调用new分配堆内存吗

gcc的string默认大小是32个字节,字符串小于等于15直接保存在栈上,超过之后才会使用new分配。