Day07 哈希表part02

文章讨论了如何优化解决LeetCode中的四数和问题(LC454、LC383、LC15和LC18),包括从暴力解法到利用哈希表降低时间复杂度至O(n^2),以及双指针方法在去重和剪枝中的应用。特别强调了数组排序和长整型处理的重要性。

第七天:哈希表part02

LC454四数相加II(未掌握

  1. 未掌握分析:考虑到了四层for循环的暴力解法,甚至很接近正解想到拆分为两组,但是没有继续下去
  2. 解题思路:四层for循环会超时,分为两组,分别为a+b和c+d,只需要a+b+c+d=0即可,时间复杂度降为O(n^2),并采用hashMap来提升查找效率
  3. 代码:
    在这里插入图片描述

LC383赎金信

在这里插入图片描述

LC15三数之和(未掌握

  1. 未掌握分析:
    • 采用确定一个元素,然后找两数之和等于-nums[i]的方法,但是问题在于去重
    • i的去重很好处理,直接if(i>0 && nums[i-1]==nums[i]) continue;
    • j的去重不好处理,如果是if(j>i+1 && nums[j-1]==nums[j]) continue;
      • 测试用例为[-2,0,1,1]时,i=0,j=3时,因为nums[2]==nums[3],会导致错过[-2,1,1]的结果
    • 并且已经是第三次看到这个题目了,仍然未想起双指针的想法,警醒!!!
  2. 错误代码:
    在这里插入图片描述
  3. 正确思路:使用双指针来处理,但是数组需要进行排序
    • 确定nums[i],定义双指针left和right,其中left = i+1,right = nums.length-1;
    • 当nums[i]+nums[left]+nums[right]>0,说明和大了,又因为数组是排序好的,因此right–
    • 当nums[i]+nums[left]+nums[right]<0,说明和小了,又因为数组是排序好的,因此left++
    • 剪枝操作:当nums[i]>0时,由于数据是排序的,后续的两数之后不可能会小于0,直接return result;
    • 去重操作:
      • i的去重:if(i>0 && nums[i-1]==nums[i]) continue;
      • left和right的去重:
        • while(left<right && nums[left]==nums[left+1]) left++;
        • while(left<right && nums[right]==nums[right-1]) right–;
  4. 代码:
    在这里插入图片描述

LC18四数之和(未掌握

  1. 解题思路:
    • 思想跟三数之和差不多,只不过是使用了两层for循环,然后使用双指针
  2. 剪枝操作:
    • 三数之和:当nums[i]>0时,由于数据是排序的,后续的两数之后不可能会小于0,直接return result;
    • 四数之和:
      • 三数之和中0是确定值,因此可使用上诉的剪枝操作,但是因为四数之和中target是不确定的,可能是负数,因此不能使用nums[i]>target。如target=-5,nums=[-4,-1,0,0]则会出错。
      • nums[i]>target && target>0
  3. 因为数据中存在超过int类型界限的数,所以sum要使用long类型,但是
    • 切记是long sum = (long)nums[i]+nums[j]+nums[left]+nums[right];
    • 而不是long sum = (long)(nums[i]+nums[j]+nums[left]+nums[right]);
    • 因为一个超出int界限就可以转换了,接下来的会自动转换,但是四个加起来已经超过了int界限就变成了其他的值再转换,失真了
  4. 代码:
    在这里插入图片描述
### 如何在 Oracle 数据库中为数据表设置分区 #### 创建分区表的方法 在 Oracle 中创建分区表可以通过 `CREATE TABLE` 命令实现。以下是常见的几种分区方式及其语法说明: 1. **范围分区(Range Partitioning)** 范围分区是最常用的分区类型之一,它基于某个字段的取值范围来划分数据。例如,按照日期字段的时间间隔进行分区。 ```sql CREATE TABLE day_interval_partition_table ( id NUMBER, time_col DATE ) PARTITION BY RANGE (time_col) ( PARTITION p1 VALUES LESS THAN (TO_DATE('2023-01-01', 'YYYY-MM-DD'))[^2], PARTITION p2 VALUES LESS THAN (TO_DATE('2024-01-01', 'YYYY-MM-DD')), PARTITION p_max VALUE LESS THAN (MAXVALUE) ); ``` 2. **列表分区(List Partitioning)** 列表分区适用于离散值集合的情况,比如按地区或类别进行分区。 ```sql CREATE TABLE region_sales ( sales_id NUMBER, sale_date DATE, region VARCHAR2(50) ) PARTITION BY LIST (region) ( PARTITION north_america VALUES ('USA', 'CANADA'), PARTITION europe VALUES ('GERMANY', 'FRANCE') ); ``` 3. **哈希分区(Hash Partitioning)** 哈希分区通过指定一个列并将其映射到固定数量的分区上来分布数据。 ```sql CREATE TABLE hash_partitioned_table ( id NUMBER, data_column VARCHAR2(100) ) PARTITION BY HASH (id) PARTITIONS 4; ``` 4. **组合分区(Composite Partitioning)** 组合分区允许同时使用两种分区策略,如先按时间范围再按哈希分配。 ```sql CREATE TABLE composite_partition_table ( order_id NUMBER, order_date DATE, customer_region VARCHAR2(50) ) PARTITION BY RANGE (order_date) SUBPARTITION BY HASH (customer_region) SUBPARTITIONS 4 STORE IN (tablespace1, tablespace2) ( PARTITION orders_q1 VALUES LESS THAN (TO_DATE('2023-04-01', 'YYYY-MM-DD')), PARTITION orders_q2 VALUES LESS THAN (TO_DATE('2023-07-01', 'YYYY-MM-DD')) ); ``` #### 将现有普通表转换为分区表 对于已有的普通表,可以采用以下方法将其转换为分区表: - 使用 `DBMS_REDEFINITION` 包重新定义表结构。 - 或者通过 CTAS(Create Table As Select)的方式复制原表的数据至新分区表中。 示例代码如下所示: ```sql -- 方法一:CTAS 方式 CREATE TABLE new_partitioned_table PARTITION BY RANGE (column_name)( PARTITION part1 VALUES LESS THAN (...), ... ) AS SELECT * FROM original_table; -- 方法二:利用 DBMS_REDEFINITION 进行在线重定义 BEGIN DBMS_REDEFINITION.START_REDEF_TABLE( uname => 'schema_name', orig_table => 'original_table', int_table => 'intermediate_partitioned_table' ); -- 执行必要的中间步骤... DBMS_REDEFINITION.FINISH_REDEF_TABLE( uname => 'schema_name', orig_table => 'original_table', int_table => 'intermediate_partitioned_table' ); END; / ``` 注意,在实际操作过程中可能还需要调整索引、约束等相关对象[^4]。 #### 导入/导出分区表数据 当涉及到迁移或者备份恢复时,可借助 Data Pump 工具完成特定分区的选择性传输工作。 命令实例展示如下: ```bash expdp user/password DIRECTORY=data_pump_dir DUMPFILE=part_data.dmp LOGFILE=export_part.log TABLES=(my_table:P1) impdp user/password DIRECTORY=data_pump_dir DUMPFILE=part_data.dmp LOGFILE=import_part.log REMAP_SCHEMA=user:user ``` 以上即是在 Oracle 数据库环境下针对不同需求设定合适类型的分区方案及相关维护技巧介绍[^1][^3].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值